关于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"