我读到 What is a metaclass in 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

以上在python3中失败(带有属性错误),我认为这是很自然的,因为python3中的所有类都已经有对象作为它们的父类,并且元类解析进入对象类。

问题:

如何在python3中制作模块级元类?

最佳答案

模块级元类并不是真正的“模块级”,它与类初始化的工作方式有关。创建类时会查找变量 "__metaclass__",如果它不在本地环境中,它将在全局环境中查找。因此,如果您有一个“模块级别” __metaclass__ 将用于之后的每个类,除非它们具有明确的元类。

在 Python 3 中,您改为在类定义中使用 metaclass= 指定元类。因此没有模块级元类。

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

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

关于模块级别的python元类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7023932/

10-12 21:44