动态地将类实例添加到Python实例à;la_uuuSetattr__

动态地将类实例添加到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.

假设我有两个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.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'