Ale*_*aru 13 python metaclass python-3.x
我尝试从示例中复制上层元类,发现这在所有情况下都不起作用:
def upper(cls_name, cls_parents, cls_attr):
""" Make all class attributes uppper case """
attrs = ((name, value) for name, value in cls_attr.items()
if not name.startswith('__'))
upper_atts = dict((name.upper(), value) for name, value in attrs)
return type(cls_name, cls_parents, upper_atts)
__metaclass__ = upper #Module level
class Foo:
bar = 1
f = Foo()
print(f.BAR) #works in python2.6
Run Code Online (Sandbox Code Playgroud)
我认为python3中的上述失败(带有属性错误)是很自然的,因为python3中的所有类都已经将对象作为父对象,并且元类解析进入了对象类.
问题:
如何在python3中创建模块级元类?
Len*_*bro 12
模块级元类不是真正的"模块级",它与类初始化的工作方式有关.类创建将"__metaclass__"
在创建类时查找变量,如果它不在本地环境中,则它将在全局中查找.因此,如果你有一个"模块级别" __metaclass__
,之后将用于每个类,除非他们有明确的元类.
在Python 3中,您改为metaclass=
在类定义中使用a指定元类.因此,没有模块级元类.
所以你会怎么做?简单:您为每个类明确指定它.
这真的没有多少额外的工作,你甚至可以通过一个很好的正则表达式搜索并替换,如果你真的有数百个类并且不想手动完成它.
归档时间: |
|
查看次数: |
1981 次 |
最近记录: |