12

我想在创建类时自动运行一些可以调用其他类方法的代码。我还没有从类声明本身中找到这样做的方法,并最终在类声明之后立即创建一个@classmethod被调用__clsinit__并从定义范围调用它。有没有我可以定义的方法,以便在创建类对象后自动调用它?

4

1 回答 1

18

您可以使用元类类装饰器来做到这一点。

类装饰器(从 2.6 开始)可能更容易理解:

def call_clsinit(cls):
    cls._clsinit()
    return cls

@call_clsinit
class MyClass:
    @classmethod
    def _clsinit(cls):
        print "MyClass._clsinit()"

元类更强大;他们可以在创建之前和之后调用代码并修改类的成分(也可以继承它们):

def call_clsinit(*args, **kwargs):
    cls = type(*args, **kwargs)
    cls._clsinit()
    return cls;

class MyClass(object):
    __metaclass__ = call_clsinit

    @classmethod
    def _clsinit(cls):
        print "MyClass._clsinit()"
于 2012-08-24T19:17:01.773 回答