Python 3的静态类属性

时间:2017-03-06 17:03:45

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

我需要为类定义自定义属性,但重新定义__getattr__仅适用于实例,而不适用于类本身,并且使其静态并不真正有用。我知道像this这样的东西适用于Python 2,但我在Python 3上找不到类似的东西,我怀疑是由于改变了元类的工作方式。我如何取得类似的结果?

2 个答案:

答案 0 :(得分:4)

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

class MyClass(metaclass = FooType): pass

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

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

  1. 更多可移植性授予您在类定义中明确继承object
  2. 比创建自定义元类更易维护。元类可能导致混乱和奇怪的冲突,描述符很简单,你得到它们挂起

答案 1 :(得分:3)

添加到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