我想在运行时修改类的初始化程序。这样的代码是否有任何潜在的捕获?我是装修工的新手,所以不太确定。
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"
答案 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
为参数的函数。