【发布时间】:2010-12-22 04:49:13
【问题描述】:
编辑:请注意,在生产代码中这样做是一个非常糟糕的主意。这对我来说只是一件有趣的事情。不要在家里这样做!
是否可以在 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 中实现呢?
【问题讨论】:
标签: python metaprogramming metaclass python-2.x