我需要为类定义自定义属性,但重新定义__getattr__
仅适用于实例,而不适用于类本身,并且使其静态并不真正有用。我知道像this这样的东西适用于Python 2,但我在Python 3上找不到类似的东西,我怀疑是由于改变了元类的工作方式。我如何取得类似的结果?
答案 0 :(得分:4)
您需要更改在Python 3中指定元类的方式。它已从dunder属性__metaclass__
更改为您在基类之后提供的kwarg
。除此之外,解决方案提供了足够的:
class MyClass(metaclass = FooType): pass
现在MyClass.Foo
或MyClass.Bar
分别调用方法_foo_func
和_bar_func
。
请注意,自定义描述符对象是链接问题中的第二个答案:
object
。 答案 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