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

Python:为文件夹中的所有文件设置元类,python,package,project,environment-variables,metaclass,Python,Package,Project,Environment Variables,Metaclass,我在python项目中编写了一个用于日志记录的元类。它使每个类自动记录所有活动。唯一的问题是,我不想进入每个文件,必须添加: __metaclass__ = myMeta 是否有办法在顶层文件夹中设置元类,以便下面的所有文件都使用该元类?否,您只能为每个类或每个模块指定元类。不能为整个包设置它 在Python3.1及以后的版本中,您可以截取内置项。\uuuu build\u class\uuuu钩住并以编程方式插入元类,请参阅 在Python2.7中,您可以用使用元类的子类替换\uuuuu内置

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

__metaclass__ = myMeta

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

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

在Python3.1及以后的版本中,您可以截取
内置项。\uuuu build\u class\uuuu
钩住并以编程方式插入元类,请参阅

在Python2.7中,您可以用使用元类的子类替换
\uuuuu内置\uuuuu.object
。就像内置的钩子一样,这是一种高级的黑客攻击,破坏你的代码就像在任何地方得到你的元类一样多

为此,请更换以下屏幕上的
对象
参考:

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

enable()
import package
disable()

限制效果。

这里有一个简单的技巧。只需使用子类中的
\uuuuuuuuuuuuuuuuuuuuuuuuuuu
属性对类本身进行子类化。这个过程可以自动化

util.py

class A(object):
    def __init__(self, first, second):
        self.first = first
        self.second = second

    def __str__(self):
        return '{} {}'.format(self.first, self.second)
main.py

from datetime import datetime
from util import A

def meta(*args):
    cls = type(*args)
    setattr(cls, 'created', datetime.now().ctime())
    return cls

try:
    print(A.created)
except AttributeError as e:
    print(e)

class A(A):
    __metaclass__ = meta

print(A.created, str(A('Michael', 'Jackson')))
试验


@slashdottir:好了,答案更新到2.7。这又是一次黑客攻击。
from datetime import datetime
from util import A

def meta(*args):
    cls = type(*args)
    setattr(cls, 'created', datetime.now().ctime())
    return cls

try:
    print(A.created)
except AttributeError as e:
    print(e)

class A(A):
    __metaclass__ = meta

print(A.created, str(A('Michael', 'Jackson')))
$ python main.py 
type object 'A' has no attribute 'created'
('Wed Mar  9 22:58:16 2016', 'Michael Jackson')