1

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

?

4

2 回答 2

2

您必须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()

于 2012-11-21T09:21:31.863 回答
0
class A(object):
    pass

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

b = B()
b.a.attr1 = 'foo'
b.a.attr2 = 'bar'
于 2012-11-21T09:26:55.633 回答