假设我有两个 Python 类,A 和 B。我希望能够执行以下操作:
>>> b = B()
>>> b.a.attr1 = 'foo'
>>> b.a.attr2 = 'bar'
__setattr__
其中 'a' 是 A 的一个实例。如果 'a' 是某种“原始”类型,我将无法使用。除了
>>> b = B()
>>> b.a = A()
>>> b.a.attr1 = 'foo'
>>> b.a.attr2 = 'bar'
?
您必须a
在__init__
of中创建B
,使用__getattr__
钩子动态创建a
,或使用属性。
__init__
方法:
class B(object):
def __init__(self):
self.a = A()
__getattr__
方法:
class B(object):
def __getattr__(self, attr):
if attr == 'a':
self.a = A()
return self.a
raise AttributeError(attr)
属性方法:
class B(object):
_a = None
@property
def a(self):
if self._a is None:
self._a = A()
return self._a
当然,属性和__getattr__
方法不必将A()
实例存储在上,它可以只从其他地方self
返回一个预先存在的实例。A()
class A(object):
pass
class B(object):
def __init__(self):
self.a = A()
b = B()
b.a.attr1 = 'foo'
b.a.attr2 = 'bar'