__getattr__和__getattribute__用于动态生成的类的类/静态属性

时间:2019-04-11 22:04:06

标签: python class metaclass getattr

This question回答了如何使用元类为静态/类属性实现__getattr__。但是,我想为__getattr__生成的类实现__getattribute__type(),并使事情变得更加有趣,该类继承了一个类,该类具有必须执行的自定义元类正确地

总结以上段落的代码:

class Inherited(metaclass=SomeFancyMetaclass):
    ...

generated_class = type("GeneratedClass", (Inherited,), {})

def __class_getattr__(cls, name):  # __getattr__ for class, not sure how the code shall look exactly like
    return getattr(cls, name)

setattr(generated_class, "__getattr__", __class_getattr__)  # similarly for __getattribute__

问题:这可能吗?如果可以,怎么办?有人可以提供一个简单的例子吗?

1 个答案:

答案 0 :(得分:1)

只需使您的元类继承自SomeFancyMetaclass,在其中正确实现__getattr__(和__getattribute__),然后使用此元类,而不是调用type来生成动态的,动态的课。

尽管您使用了大量的seldon用过的东西,但是并没有特殊的机制-应该是普通的Python-

当然,您没有在元类特殊方法中告诉您想做什么-在那里可能要执行一些不可思议的事情-并且,如果您正在做__getattribute__,您始终必须格外小心,并将您不关心的所有属性重定向到超级调用,否则将无济于事。

此外,请记住,这两种方法都可能使用属性访问美化来“创建魔术dunder方法”,即:您的类不会神奇地具有__add__或{{1 }}方法,因为您的元类__dir__会生成一个-而是由Python运行时在特定的插槽中固定的,它们的检查和调用会绕过Python中的常规属性查找。

否则:

__getattribute__