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"