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__
问题:这可能吗?如果可以,怎么办?有人可以提供一个简单的例子吗?
答案 0 :(得分:1)
只需使您的元类继承自SomeFancyMetaclass,在其中正确实现__getattr__
(和__getattribute__
),然后使用此元类,而不是调用type
来生成动态的,动态的课。
尽管您使用了大量的seldon用过的东西,但是并没有特殊的机制-应该是普通的Python-
当然,您没有在元类特殊方法中告诉您想做什么-在那里可能要执行一些不可思议的事情-并且,如果您正在做__getattribute__
,您始终必须格外小心,并将您不关心的所有属性重定向到超级调用,否则将无济于事。
此外,请记住,这两种方法都可能使用属性访问美化来“创建魔术dunder方法”,即:您的类不会神奇地具有__add__
或{{1 }}方法,因为您的元类__dir__
会生成一个-而是由Python运行时在特定的插槽中固定的,它们的检查和调用会绕过Python中的常规属性查找。
否则:
__getattribute__