This does what you wanted:
class Basket(object): def __init__(self):
Another way to do this would be a metaclass ... but they confuse a lot of people ^^.
Because I am bored:
class WithProperties(type): """ Converts `__props__` names to actual properties """ def __new__(cls, name, bases, attrs): props = set( attrs.get('__props__', () ) ) for base in bases: props |= set( getattr( base, '__props__', () ) ) def make_prop( name ): def getter( self ): return "I'm a " + name return property( getter ) for prop in props: attrs[ prop ] = make_prop( prop ) return super(WithProperties, cls).__new__(cls, name, bases, attrs) class Basket(object): __metaclass__ = WithProperties __props__ = ['Apple', 'Pear'] Air = property(lambda s : "I'm Air") class OtherBasket(Basket): __props__ = ['Fish', 'Bread'] if __name__ == "__main__": b = Basket() print b.Air print b.Apple print b.Pear c = OtherBasket() print c.Air print c.Apple print c.Pear print c.Fish print c.Bread
source share