python修改整个程序的__metaclass__

Sta*_*tan 2 python metaprogramming metaclass python-2.x

编辑:请注意,这在生产代码中是一个非常糟糕的想法.这对我来说只是一个有趣的事情.不要在家里这样做!

是否可以在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
Run Code Online (Sandbox Code Playgroud)

但我希望能够改变__metaclass__甚至在子模块中工作.例如(文件m1.py):

 class A:
       pass

 a=A()
 print a
Run Code Online (Sandbox Code Playgroud)

文件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
Run Code Online (Sandbox Code Playgroud)

我知道全局__metaclass__不再适用于Python 3.X,但这不是我的关注(我的代码是否有概念验证).那么有没有办法在Python-2.x中实现这一目标?

Ale*_*lli 7

__metaclass__Python 2 的"全局"功能仅用于按模块工作(只是想想它会造成什么样的破坏,否则,通过在从该点开始导入的所有库和第三方模块上强制使用自己的元类 -不寒而栗!).如果你"偷偷"改变你从某一点开始导入的所有模块的行为非常重要,不管是什么样的斗篷和匕首,你都可以用导入钩子玩非常肮脏的技巧(最糟糕的是首先将源复制到临时位置,同时改变它们......)但是努力将与契约的严重程度相称,这似乎是合适的;-)