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

__getattr__ and __getattribute__ for class/static atributes of dynamically generated classes

This question 回答了如何为 static/class 属性实现 __getattr__ - 使用元 class。但是,我想为 type() 生成的 class 实现 __getattr____getattribute__,为了让事情更有趣, class 继承了 class 有一个必须正确执行的自定义元class。

总结以上段落的代码:

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__

问题:这可能吗?如果可能,怎么办?有人可以提供一个最小的工作示例吗?

只需让您的元class继承自 SomeFancyMetaclass,在那里正确实现 __getattr__(和 __getattribute__),并使用此元class ,而不是调用 type 来生成继承的动态 class.

虽然你使用了很多很少用的东西,但没有特殊的机制 - 它应该很简单 Python -

当然,您没有在 metaclass 特殊方法中告诉 您想要做什么 - 那里可能会执行一些黑魔法 - 并且如果你在做__getattribute__,你总是要格外小心,把你不关心的所有属性重定向到超级调用,否则,什么都不起作用。

此外,请记住,这两种方法都可能实现的属性访问自定义不适用于 "create magic dunder methods" - 也就是说:您的 class 不会神奇地拥有 __add____dir__ 方法,因为您的 metaclass __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,), {})