10

クラス変数を拡張する最良の方法を見つけようとしています。これまでに思いついた方法の例がこれを明確にすることを願っています。

class A(object):
    foo = ['thing', 'another thing']

class B(A):
    foo = A.foo + ['stuff', 'more stuff']

そのため、サブクラスに親のクラス変数を継承および拡張させようとしています。上記の方法は機能しますが、少し面倒です。まったく異なるアプローチを使用して同様のことを達成することを含め、あらゆる提案を受け入れます。

明らかに、必要に応じてこの方法を引き続き使用できますが、より良い方法があれば見つけたいと思います。

4

2 に答える 2

8

メタクラスを使用できます:

class AutoExtendingFoo(type):

    def __new__(cls, name, bases, attrs):
        foo = []
        for base in bases:
           try:
               foo.extend(getattr(base, 'foo'))
           except AttributeError:
               pass
        try:
            foo.extend(attrs.pop('foo_additions'))
        except KeyError:
            pass
        attrs['foo'] = foo
        return type.__new__(cls, name, bases, attrs)

class A(object):
    __metaclass__ = AutoExtendingFoo
    foo_additions = ['thing1', 'thing2']
    # will have A.foo = ['thing1', 'thing2']

class B(A):
    foo_additions = ['thing3', 'thing4']
    # will have B.foo = ['thing1', 'thing2', 'thing3', 'thing4']

class C(A):
    pass
    # will have C.foo = ['thing1', 'thing2']

class D(B):
    pass
    # will have D.foo = ['thing1', 'thing2', 'thing3', 'thing4']
于 2012-07-26T19:26:06.953 に答える
1

私は間違いなくinstance-propertiesに行きます。(私がそれを正しく理解した場合、それらはあなたの場合に静的であるとは限りませんか?!)

>>> class A:
...     @property
...     def foo(self):
...         return ['thin', 'another thing']
...
>>> class B(A):
...     @property
...     def foo(self):
...         return super().foo + ['stuff', 'thing 3']
...
>>> B().foo
['thin', 'another thing', 'stuff', 'thing 3']
于 2012-07-26T20:27:08.800 に答える