Skip to content Skip to sidebar Skip to footer

Python Class Properties

I'm trying to find the best way to extend a class variable. Hopefully an example of the method I've come up with so far will make this clear. class A(object): foo = ['thing',

Solution 1:

Could use a metaclass:

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']

Solution 2:

I definitively would go for instance-properties. (if I got it right, they are not bound to be static for your case?!)

>>>classA:...    @property...deffoo(self):...return ['thin', 'another thing']...>>>classB(A):...    @property...deffoo(self):...returnsuper().foo + ['stuff', 'thing 3']...>>>B().foo
['thin', 'another thing', 'stuff', 'thing 3']

Post a Comment for "Python Class Properties"