关于Python3元类的几个问题

关于Python3元类的几个问题,python,python-3.x,metaclass,Python,Python 3.x,Metaclass,回溯(最近一次呼叫最后一次): 文件“E:\python\test.py”,第32行,在 打印(对象栏) AttributeError:“Hello”对象没有属性“BAR” 为什么元类UpperAttrMetaclass不起作用?在Python3中,指定元类的方式与Python2不兼容 自Python 3.0以来,指定元类的方法是使用元类名称,就像它是class语句本身上的命名参数一样 因此,在上面的示例中,您应该将Hello类声明为: class UpperAttrMetaclass(type

回溯(最近一次呼叫最后一次):
文件“E:\python\test.py”,第32行,在
打印(对象栏)
AttributeError:“Hello”对象没有属性“BAR”


为什么元类UpperAttrMetaclass不起作用?

在Python3中,指定元类的方式与Python2不兼容

自Python 3.0以来,指定元类的方法是使用元类名称,就像它是
class
语句本身上的命名参数一样

因此,在上面的示例中,您应该将Hello类声明为:

class UpperAttrMetaclass(type):

    var = "test"

    def __new__(upperattr_metaclass, future_class_name,
                future_class_parents, future_class_attr):
        print("hello world")
        uppercase_attr = {}
        for name, val in future_class_attr.items():
            if not name.startswith('__'):
                uppercase_attr[name.upper()] = val
            else:
                uppercase_attr[name] = val

        # reuse the type.__new__ method
        # this is basic OOP, nothing magic in there
        return type.__new__(upperattr_metaclass, future_class_name,
                            future_class_parents, uppercase_attr)


class Hello(object):

    __metaclass__ = UpperAttrMetaclass

    bar = "test"

obj = Hello()
print(obj.BAR)  # obj has no attribute named BAR
查看以下位置的文档:

除此之外,正如您所注意到的,将
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu元类
属性放在c alss主体中并不是一个错误,但它什么都不做,只是声明一个具有该名称的属性

在两个Python3.x版本发布之后,这是唯一一个与Python2不兼容的语法更改,并且无法以简单的方式解决,因此代码同时与Python2.x和Python3.x兼容

如果您需要在Python 2和Python 3上运行相同的代码库,那么名为
six
的包将调用
,并使用与这两个版本兼容的语法构建动态类库。

()

为什么这个问题被否决了,可能是重复的?它确实有一个完美的代码示例和一个精心设计的问题(如果取决于问题标题)。
class Hello(metaclass=UpperAttrMetaclass):
    bar = "test"