在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)
一些有趣的链接: