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

标签 python package project environment-variables metaclass

我在 python 项目中编写了一个用于日志记录的元类。它使每个类(class)自动记录所有事件。唯一的问题是我不想进入每个文件并必须添加:

__metaclass__ = myMeta

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

最佳答案

不可以,您只能为每个类或每个模块指定元类。您不能为整个包设置它。

在 Python 3.1 及更高版本中,您可以拦截 builtins.__build_class__ Hook 并以编程方式插入元类,请参阅 Overriding the default type() metaclass before Python runs .

在 Python 2.7 中,您可以将 __builtins__.object 替换为使用您的元类的子类。与 builtins.__build_class__ Hook 一样,这是高级黑客并且会破坏您的代码,就像在任何地方获取您的元类一样。

通过替换 __builtin__ module 上的 object 引用来做到这一点:

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

在导入您的包之前运行enable(),所有新式类(那些可以支持元类的类)都将拥有您的元类。请注意,当您的包导入代码时,此行为现在将传播到所有 尚未加载的 Python 代码,包括标准库。你可能想使用:

enable()
import package
disable()

限制影响。

关于Python:为文件夹中的所有文件设置元类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16178519/

相关文章:

python - Spyder - python - 安装外部包

package - Julia:我如何在特定版本的包中找到 "fix"?

java - 在java android应用程序中需要帮助

eclipse - 项目 ""的目标位置已存在,无法移动项目

python - 我应该在哪里执行logging.basicConfig()?

python - VLC 媒体播放器 API

java - Android 包名称

java - 项目 Euler #10 Java 不工作

python - 如何在 CLI 提示中回答 (yes/y)? (paramiko远程连接)

python - Python 的 Doxygen : one paragraph to document both file and package