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

标签 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__

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

最佳答案

只需让您的元类继承自 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/

相关文章:

python:元类中__new__的时间

python - Django 搜索 : query multiple table, 加入它们然后返回查询集

python - 更改父级继承的python类的方法

使用原型(prototype)的 Javascript 类变量范围

javascript - 在不调用构造函数的情况下实例化javascript类

python - 如何为我的任务创建合适的元类?

python - 如何子类化 Django TextChoices 以添加其他属性?

python - numpy 数组的异常(exception)情况

python - SQLITE3 Python 更新带有变量的记录不起作用?

Python Popen 挂起与 psexec - 不希望的结果