這樣做的一種方法是用元類。只要確保它真的是你想要的,並且不要盲目複製,如果你不明白它是如何工作的。
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中只帶有一個參數的類。
爲什麼'setattr(owner,'bar_attribute','bar_value')'而不是'owner.bar_attribute ='bar_value''? – delnan 2011-05-21 18:43:41
我很確定*沒有*(沒有調用堆棧的魔法,我期望在響應中看到)。對於像這樣調用/創建'FooDecoractor'沒有什麼特別之處。 Pythonic的方式通常是「明確的」。 – 2011-05-21 18:48:56
對於調用堆棧魔術,請參閱[SO:如何獲取調用方法名稱?](http://stackoverflow.com/questions/2654113/python-how-to-get-the-callers-method-name-in - 所謂的方法) – 2011-05-21 18:51:04