元类配置。 Python版本冲突

时间:2016-04-26 18:26:26

标签: python python-2.7 attributes python-3.4 metaclass

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抛出属性错误

这是输出(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

我该如何解决这个问题?元类以不同的方式工作??

1 个答案:

答案 0 :(得分:1)

在python3中,您声明了内联的元类:

class Cls(object, metaclass=UpperAttrMetaclass):
    ...

我认为2to3应该处理这个问题,但是如果你需要在不使用2to3的情况下同时支持同一个源文件,那么你可能需要某种填充库。 six是事实上的标准。您需要使用six.with_metaclass

import six
class Cls(six.with_metaclass(UpperAttrMetaclass, object)):
    ...