自修改Python类

时间:2014-07-29 15:31:42

标签: python class metaprogramming decorator

我想在运行时修改类的初始化程序。这样的代码是否有任何潜在的捕获?我是装修工的新手,所以不太确定。

class Object:
    def __init__(self):
        print "do something"
    @classmethod
    def modify(cls, f):
        __init___old = cls.__init__
        def __init__(self):
            __init___old(self)
            f(self)
        cls.__init__ = __init__
        return f

@Object.modify
def f(self):
    print "do something else"

2 个答案:

答案 0 :(得分:2)

除了让那些不熟悉python强大的元编程工具的人感到困惑之外,像你这样的事情应该可以正常工作。类是可修改的是python的一个特性。

但是,我建议找一个更常规的方法来做你需要做的事情,元编程导致文件中的源代码不再匹配代码粗略检查代码所做的事情,所以它是对可读性不是很好。对于这种特殊情况,您可以附加到类变量中的列表,以便在__init__的循环中调用。

您可能会遇到或可能不会遇到的唯一问题是,如果您使用python优化编译器,例如psyco,pypy,使用这样的动态功能可能会导致他们无法像以前那样优化事物。

答案 1 :(得分:2)

不要像这样重新定义__init__,而是让你的类保留一个应该在对象初始化时执行的函数列表(可以扩充)。

class Object:
    obj_initializers = []
    def __init__(self):
        print "do something"
        for f in self.obj_initializers:
            f(self)

    @classmethod
    def add_initializer(cls, f):
        cls.obj_initializers.append(f)

def f(self):
    print "do something else"

Object.add_initializer(f)

在您的代码中,f并未实际修改;你只是滥用装饰器语法来执行另一个以f为参数的函数。