【发布时间】:2019-09-02 15:20:34
【问题描述】:
This question 回答如何为静态/类属性实现__getattr__ - 使用元类。但是,我想为type() 生成的类实现__getattr__ 和__getattribute__,让事情变得更有趣,该类继承了一个具有必须正确执行的自定义元类的类。
总结以上段落的代码:
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__
问题:这可能吗?如果可以,怎么做?有人可以提供一个最小的工作示例吗?
【问题讨论】:
-
你需要在元类上实现
__getattr__和__setattr__,但是你必须使用元类来生成类,我相信 -
你可以通过
type("GeneratedClass", (Inherited,), {'__getattr__': your_getattr_impl})在一行中创建生成的类,并且your_getattr_impl应该有一个签名(self, name)(self而不是cls,因为类的实例将在使用时传递),除非您想在元类级别执行此操作。此外,您真的不需要元类来为 dunder 函数动态创建具有自定义属性的类。你到底想达到什么目的? -
@metatoaster 他们正在尝试在元类上实现那些 sunder 方法,以便它可以与类属性一起使用
-
@juanpa.arrivillaga 我可以看到,但除非有充分的理由这样做,否则重写元类和使用动态类构造几乎总是矫枉过正。我的意思是建议 OP 采用一种技术,除非有充分的理由同时使用这两种技术。
-
您应该能够像使用
type(...,...,...)一样使用MyCustomMeta(...,...,...),但他们只需要实际实现MyCustomMeta我的意思是,所有这些都可能是矫枉过正。为什么现在停止...
标签: python class metaclass getattr