动态地将类实例添加到Python实例à;la_uuuSetattr__
假设我有两个Python类,A和B。我希望能够执行以下操作:动态地将类实例添加到Python实例à;la_uuuSetattr__,python,oop,Python,Oop,假设我有两个Python类,A和B。我希望能够执行以下操作: >>> b = B() >>> b.a.attr1 = 'foo' >>> b.a.attr2 = 'bar' 其中“a”是a的一个实例。我不能像使用“a”时那样使用\uuu setattr\uuu “原始”类型。除此之外,还有什么优雅的方法可以做到这一点吗 >>> b = B() >>> b.a = A() >>> b.a.
>>> b = B()
>>> b.a.attr1 = 'foo'
>>> b.a.attr2 = 'bar'
其中“a”是a的一个实例。我不能像使用“a”时那样使用\uuu setattr\uuu
“原始”类型。除此之外,还有什么优雅的方法可以做到这一点吗
>>> b = B()
>>> b.a = A()
>>> b.a.attr1 = 'foo'
>>> b.a.attr2 = 'bar'
?您必须在
B
的初始化中创建a
,使用a动态创建a
,或者使用a
\uuuu初始方法
方法:
class B(object):
def __init__(self):
self.a = A()
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
\uuuu getattr\uuuu
方法:
class B(object):
def __init__(self):
self.a = A()
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
财产法:
class B(object):
def __init__(self):
self.a = A()
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
当然,属性和方法不必将A()
实例存储在self
上,它可以只从其他地方返回一个预先存在的A()
实例。为什么不将self.A=A()
放入B.\uu init
方法?我应该提到。。。我不能这样做,因为我将在\uuuu init\uuuu
中无条件实例化的许多类(可能)不会被使用。另外,A()中的某些代码可能在\uuuuu init\uuuuu
时间触发,我不一定准备好。谢谢。哈!!您的\uuu getattr\uuu
方法正是我想要的。我不会想到使用\uu GETattr\uuu
,因为我正在用b.a.attr1='foo'
\uu init\uuu
设置一个属性,因为我不想实例化一堆我可能不会使用的类。我应该提到这一点。谢谢
class A(object):
pass
class B(object):
def __init__(self):
self.a = A()
b = B()
b.a.attr1 = 'foo'
b.a.attr2 = 'bar'