【发布时间】:2011-10-24 20:01:01
【问题描述】:
我读过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 中创建模块级元类?
【问题讨论】:
-
可能你需要的是一个类装饰器而不是一个元类。
-
@Sven Marnach:
__metaclass__可能确实绑定到一个函数。该函数只需要接受与元类的__init__()方法相同的参数并返回一个类型对象。 -
@Sven Marnach:需要接受与元类的 __init__() 方法相同的参数 - 即
self除外。 -
@pillmuncher:你基本上是对的,除了它与元类的
__new__()方法的参数相同。我不知道这一点,尽管实际上很明显任何可调用对象都可以。 (请注意,可调用对象甚至不需要返回类型对象。可调用对象返回的任何对象都将绑定到类名。) -
那么,是 模块级元类的python3等价物是什么?似乎没有人回答你的实际问题。该功能是否已被废弃?有求知欲的人想知道。
标签: python python-3.x metaclass