模块级别的python元类

Ale*_*aru 13 python metaclass python-3.x

我读过Python中的元类是什么?

我尝试从示例中复制上层元类,发现这在所有情况下都不起作用:

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指定元类.因此,没有模块级元类.

所以你会怎么做?简单:您为每个类明确指定它.

这真的没有多少额外的工作,你甚至可以通过一个很好的正则表达式搜索并替换,如果你真的有数百个类并且不想手动完成它.

  • 我建议你使用一个模块范围的超类,比如`class Base(object,metaclass = upper):pass`然后在这个基类上建立所有相关的类. (2认同)