编辑:请注意,这是一个在生产代码中做的真正不好的想法。这对我来说只是一件有趣的事情。不要在家里这样做!python修改整个程序的__metaclass__
是否有可能在Python中修改整个程序(解释器)的__metaclass__变量?
这个简单的例子是工作:
class ChattyType(type):
def __init__(cls, name, bases, dct):
print "Class init", name
super(ChattyType, cls).__init__(name, bases, dct)
__metaclass__= ChattyType
class Data:
pass
data = Data() # prints "Class init Data"
print data
,但我很想成为__metaclass__的能够改变在子模块甚至工作。因此,例如(文件m1.py):
class A:
pass
a=A()
print a
文件main.py:
class ChattyType(type):
def __init__(cls, name, bases, dct):
print "Class init", name
super(ChattyType, cls).__init__(name, bases, dct)
__metaclass__= ChattyType
import m1 # and now print "Class init A"
class Data:
pass
data = Data() # print "Class init Data"
print data
据我所知,全球__metaclass__不再在Python 3.X的工作,但是这不是我关心的(我的代码,如果概念证明)。那么有什么方法可以在Python-2.x中完成这个任务吗?
确实是黑魔法,但有趣的是:-) – Stan 2009-12-02 11:31:05