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__
问题:这可能吗?如果可能,如何实现?有人可以提供一个最小的工作示例吗?
最佳答案
只需让您的元类继承自 SomeFancyMetaclass,正确实现 __getattr__
(和 __getattribute__
),然后使用此元类,而不是调用 type
生成您固有的动态类。
虽然你使用了很多很少使用的东西,但没有特殊的机制 - 它应该是普通的 Python -
当然,您没有告诉什么您想在元类特殊方法中执行操作 - 那里可能会执行一些黑魔法 - 如果您正在执行__getattribute__
,你总是要格外小心,并将所有你不关心的属性重定向到 super 调用,否则,什么都不起作用。
此外,请记住,这两种方法都可能实现的属性访问自定义化无法“创建神奇的 dunder 方法” - 也就是说:您的类不会神奇地具有 __add__
或__dir__
方法,因为您的元类 __getattribute__
会生成一个方法 - 相反,这些方法由 Python 运行时固定在特殊槽中,并且它们的检查和调用会绕过 Python 中的正常属性查找。
否则:
class Inherited(metaclass=SomeFancyMetaclass):
...
class MagicAttrsMeta(Inherited.__class__):
def __getattr__(self, attr):
if attr in ("flying", "circus", "brian", "king_arthur"):
return "coconut"
raise AttributeError()
generated_class = MagicAttrsMeta("GeneratedClass", (Inherited,), {})
关于python - __getattr__ 和 __getattribute__ 用于动态生成的类的类/静态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55641809/