【问题标题】:Metaclass configure. Python version conflict元类配置。 Python版本冲突
【发布时间】:2016-08-20 18:06:06
【问题描述】:
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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    我认为2to3 应该可以处理这个问题,但是如果您需要在同一个源文件中同时支持这两者而不使用2to3,那么您可能需要某种匀场库。 six 是这里的事实标准。你会想要使用six.with_metaclass:

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

    【讨论】:

      猜你喜欢
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多