Python:为文件夹中的所有文件设置元类
我在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内置
__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')