我在 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/