做这样的事情的一种方法是使用元类。只要确保它真的是你想要的,如果你不明白它是如何工作的,不要盲目复制。
class Descriptor(object):
pass
class Meta(type):
def __new__(cls, name, bases, attrs):
obj = type.__new__(cls, name, bases, attrs)
# obj is now a type instance
# this loop looks for Descriptor subclasses
# and instantiates them, passing the type as the first argument
for name, attr in attrs.iteritems():
if isinstance(attr, type) and issubclass(attr, Descriptor):
setattr(obj, name, attr(obj))
return obj
class FooDescriptor(Descriptor):
def __init__(self, owner):
owner.foo = 42
class BarClass(object):
__metaclass__ = Meta
foo_attribute = FooDescriptor # will be instantiated by the metaclass
print BarClass.foo
如果您需要传递额外的参数,您可以使用例如一个元组来(class, args)
代替类,或者制作FooDescriptor
一个装饰器,该装饰器将返回一个在ctor 中只接受一个参数的类。