【发布时间】:2017-03-06 17:03:45
【问题描述】:
我需要为类定义自定义属性,但重新定义__getattr__ 仅适用于实例,不适用于类本身,并且将其设为静态并没有真正的帮助。我知道像 this 这样的东西适用于 Python 2,但我在 Python 3 上找不到类似的东西,我怀疑是因为改变了元类的工作方式。我怎样才能达到类似的结果?
【问题讨论】:
标签: python python-3.x class static-methods
我需要为类定义自定义属性,但重新定义__getattr__ 仅适用于实例,不适用于类本身,并且将其设为静态并没有真正的帮助。我知道像 this 这样的东西适用于 Python 2,但我在 Python 3 上找不到类似的东西,我怀疑是因为改变了元类的工作方式。我怎样才能达到类似的结果?
【问题讨论】:
标签: python python-3.x class static-methods
您需要更改在 Python 3 中指定元类的方式。它已从 dunder 属性 __metaclass__ 更改为您在基类之后提供的 kwarg。除此之外,那里提供的解决方案就足够了:
class MyClass(metaclass = FooType): pass
现在MyClass.Foo 或MyClass.Bar 分别调用_foo_func 和_bar_func 方法。
请注意,自定义描述符对象,即链接问题中的第二个答案,是:
object 继承而来的可移植性更高。 【讨论】:
添加给 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
【讨论】: