Python:为文件夹中的所有文件设置元类

amu*_*afa 8 python metaclass project environment-variables package

我写了一个元类,我在python项目中用于记录目的.它使每个类自动记录所有活动.唯一的问题是我不想进入每个文件并且必须添加:

__metaclass__ = myMeta
Run Code Online (Sandbox Code Playgroud)

有没有办法在顶级文件夹中设置元类,以便下面的所有文件都使用该元类?

Mar*_*ers 6

不,您只能为每个类或每个模块指定元类.您无法为整个包设置它.

在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)

限制效果.