元类配置。 Python 版本冲突
Metaclass configure. Python version conflict
class UpperAttrMetaclass(type):
def __new__(cls, name, bases, attrs):
attrs["b"] = 77
return super(UpperAttrMetaclass, cls).__new__(cls, name, bases, attrs)
class Cls(object):
__metaclass__ = UpperAttrMetaclass
f = Cls()
print(f.b)
我试图在 Python 3.4.3 和 2.7.11 上 运行 这段代码。
在 2.7.11 中运行良好(输出 - 77
),但 3.4.3 抛出 Attribute Error
这是输出 (3.4.3)
Traceback (most recent call last):
File "D:/LABS/BSUIR_labs/4cem/PYTHON/lab2/meta.py", line 8, in <module>
print(f.b)
AttributeError: 'Cls' object has no attribute 'b'
Process finished with exit code 1
我该如何解决这个问题?元类以不同的方式工作??
在 python3 中,声明内联元类:
class Cls(object, metaclass=UpperAttrMetaclass):
...
我认为 2to3
应该处理这个问题,但是如果您需要在不使用 2to3
的情况下在同一个源文件中同时支持两者,那么您可能需要某种填充库。 six
是这里事实上的标准。您需要使用 six.with_metaclass
:
import six
class Cls(six.with_metaclass(UpperAttrMetaclass, object)):
...
class UpperAttrMetaclass(type):
def __new__(cls, name, bases, attrs):
attrs["b"] = 77
return super(UpperAttrMetaclass, cls).__new__(cls, name, bases, attrs)
class Cls(object):
__metaclass__ = UpperAttrMetaclass
f = Cls()
print(f.b)
我试图在 Python 3.4.3 和 2.7.11 上 运行 这段代码。
在 2.7.11 中运行良好(输出 - 77
),但 3.4.3 抛出 Attribute Error
这是输出 (3.4.3)
Traceback (most recent call last):
File "D:/LABS/BSUIR_labs/4cem/PYTHON/lab2/meta.py", line 8, in <module>
print(f.b)
AttributeError: 'Cls' object has no attribute 'b'
Process finished with exit code 1
我该如何解决这个问题?元类以不同的方式工作??
在 python3 中,声明内联元类:
class Cls(object, metaclass=UpperAttrMetaclass):
...
我认为 2to3
应该处理这个问题,但是如果您需要在不使用 2to3
的情况下在同一个源文件中同时支持两者,那么您可能需要某种填充库。 six
是这里事实上的标准。您需要使用 six.with_metaclass
:
import six
class Cls(six.with_metaclass(UpperAttrMetaclass, object)):
...