【问题标题】:Static class attributes with Python 3Python 3 的静态类属性
【发布时间】:2017-03-06 17:03:45
【问题描述】:

我需要为类定义自定义属性,但重新定义__getattr__ 仅适用于实例,不适用于类本身,并且将其设为静态并没有真正的帮助。我知道像 this 这样的东西适用于 Python 2,但我在 Python 3 上找不到类似的东西,我怀疑是因为改变了元类的工作方式。我怎样才能达到类似的结果?

【问题讨论】:

    标签: python python-3.x class static-methods


    【解决方案1】:

    您需要更改在 Python 3 中指定元类的方式。它已从 dunder 属性 __metaclass__ 更改为您在基类之后提供的 kwarg。除此之外,那里提供的解决方案就足够了:

    class MyClass(metaclass = FooType): pass
    

    现在MyClass.FooMyClass.Bar 分别调用_foo_func_bar_func 方法。

    请注意,自定义描述符对象,即链接问题中的第二个答案,是:

    1. 在您的类定义中明确地从object 继承而来的可移植性更高。
    2. 比创建自定义元类更易于维护。元类可能会导致混乱和奇怪的冲突,描述符在你掌握它们之后很简单

    【讨论】:

      【解决方案2】:

      添加给 Jims 的回答:如果您需要 Python2 和 3 的兼容性,您可以使用 six.add_metaclass 类装饰器:

      import six
      
      @six.add_metaclass(your_metaclass)
      class Yourclass():  # no need to add "metaclass = your_metaclass" here!
          # no need to define "__metaclass__ = your_metaclass" here
      

      如文档所述,这是:

      @six.add_metaclass(Meta)
      class MyClass(object):
          pass
      

      等同于(python2):

      class MyClass(object):
          __metaclass__ = Meta
      

      或(python3):

      class MyClass(object, metaclass=Meta):
          pass
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-07
        • 1970-01-01
        • 2021-12-15
        • 2011-06-11
        • 2014-09-10
        • 2011-07-29
        • 1970-01-01
        • 2010-11-19
        相关资源
        最近更新 更多