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

时间:2012-11-21 09:13:42

标签: python oop

假设我有两个Python类,A和B.我希望能够执行以下操作:

>>> b = B()
>>> b.a.attr1 = 'foo'
>>> b.a.attr2 = 'bar'

其中'a'是A的实例。如果'a'是某些,我就不能使用__setattr__ “原始”类型。除了

之外,还有一些优雅的方法来实现这一目标
>>> b = B()
>>> b.a = A()
>>> b.a.attr1 = 'foo'
>>> b.a.attr2 = 'bar'

2 个答案:

答案 0 :(得分:2)

您必须在a的{​​{1}}中创建__init__,使用__getattr__ hook动态创建B,或使用{{} 3}}

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()上,它可能只返回一个预先存在的{来自其他地方的{1}}实例。

答案 1 :(得分:0)

class A(object):
    pass

class B(object):
    def __init__(self):
        self.a = A()

b = B()
b.a.attr1 = 'foo'
b.a.attr2 = 'bar'