__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,), {})
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,), {})