1

AとBの2つのPythonクラスがあるとします。次のことができるようにしたいと思います。

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

ここで、「a」はAのインスタンスです。__setattr__「a」が「プリミティブ」タイプである場合のように使用することはできません。これを達成するためのエレガントな方法はありますか?

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

4

2 に答える 2

2

aので作成するか、フック__init__を使用して動的に作成するか、プロパティを使用する必要があります。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()selfA()

于 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 に答える