Я читаю Что такое метакласс в 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?