bar
和
foo
在创建实例时打印,因为
_a.__getattribue__("foo")
和
_a.foo
都将调用属性对象以获取值。
在中设置的两个属性
B
使用lambda获得正确的
property
从
A
. 这是一个常见的错误时,调用兰姆达斯。因为
attr
值是从外部作用域继承的,在计算lambda时不会冻结该值。相反,它是完全相同的
阿特尔
作为封闭范围的引用
阿特尔
,并相应更改。所以你所有的羊羔都要一样的
阿特尔
价值。
您可以定义
B.__getattr__
方法。当普通属性查找失败时调用此方法。
class B:
def __init__(self):
self._a = A()
def __getattr__(self, name):
return getattr(self._a, name)
b = B()
b.bar
# bar
b.foo
# foo