amu*_*afa 8 python metaclass project environment-variables package
我写了一个元类,我在python项目中用于记录目的.它使每个类自动记录所有活动.唯一的问题是我不想进入每个文件并且必须添加:
__metaclass__ = myMeta
Run Code Online (Sandbox Code Playgroud)
有没有办法在顶级文件夹中设置元类,以便下面的所有文件都使用该元类?
不,您只能为每个类或每个模块指定元类.您无法为整个包设置它.
在Python 3.1及更高版本中,您可以截取builtins.__build_class__钩子并以编程方式插入元类,请参阅在Python运行之前覆盖默认的type()元类.
在Python 2.7中,您可以替换__builtins__.object使用您的元类的子类.就像builtins.__build_class__钩子一样,这是先进的hackery并且破坏你的代码就像在任何地方获得你的元类一样.
通过替换模块object上的引用来执行此操作:__builtin__
import __builtin__
class MetaClass(type):
def __new__(mcls, name, *args):
# do something in the metaclass
return super(MetaClass, mcls).__new__(mcls, name, *args)
orig_object = __builtin__.orig_object
class metaobject(orig_object):
__metaclass__ = MetaClass
def enable():
# *replace* object with one that uses your metaclass
__builtin__.object = metaobject
def disable():
__builtin__.object = orig_object
Run Code Online (Sandbox Code Playgroud)
enable()在导入包之前运行它,所有新类(可以支持元类的类)将具有您的元类.请注意,此行为现在将传播到尚未加载的所有 Python代码,包括标准库,因为您的包导入代码.您可能想要使用:
enable()
import package
disable()
Run Code Online (Sandbox Code Playgroud)
限制效果.