创建对变量的引用(类似于PHP的"=&")?

Phi*_*ham 5 python reference

在PHP中,可以创建一个引用变量,这样两个命名变量就可以看到相同的值:

$a = 1;
$b =& $a;
echo $a; // 1
echo $b; // 1
$b = 2;
echo $a; // 2
Run Code Online (Sandbox Code Playgroud)

我希望在Python中实现类似的功能.具体来说,我想创建一个对象属性的引用,例如:

class Foo(object):
  @property
  def bar(self): return some_calculated_value

foo_instance = Foo()
ref = foo_instance.bar 
# so that 'ref' is referencing the bar property on foo, calculated when used.
Run Code Online (Sandbox Code Playgroud)

这可能吗?

小智 5

在Python中可以做更多的魔术(不是我会推荐它,它需要挖掘你的部分;-),但使用闭包可能足以满足你的需求:

get_x = lambda: foo_instance.bar
get_x() # yahoo!
Run Code Online (Sandbox Code Playgroud)

编辑,对于那些想要"更新支持"的人来说,关键是闭包:

def wrap_prop (obj, pname):
  def _access(*v):
    if not len(v):
      return getattr(obj, pname)
    else
      setattr(obj, pname, v[0])
  return _access

class z (object):
  pass

access = wrap_prop(z(), "bar")
access(20)
access() # yahoo! \o/
Run Code Online (Sandbox Code Playgroud)

如果没有超出正常范围(对我来说:-)接受Python,也可以编写这个来返回带有转发/代理属性的对象,想象一下:

access = wrap_prop(z(), "bar")
access.val = 20
access.val # yahoo \o/
Run Code Online (Sandbox Code Playgroud)

一些有趣的链接: