gpt4 book ai didi

模块级的 python 元类

转载 作者:太空狗 更新时间:2023-10-29 17:30:29 25 4
gpt4 key购买 nike

我读了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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com