Python __动态生成类的类/静态属性的getattr_uuuuu和uuuu getattribute_uuuu

Python __动态生成类的类/静态属性的getattr_uuuuu和uuuu getattribute_uuuu,python,class,metaclass,getattr,Python,Class,Metaclass,Getattr,解答如何使用元类为静态/类属性实现\uuuu getattr\uuuu。但是,我想为type()生成的类实现\uuuu getattr\uuuu和\uuu getattribute\uuuuu,并且为了让事情更有趣,该类继承了一个类,该类具有必须正确执行的自定义元类 总结上述段落的代码: class Inherited(metaclass=SomeFancyMetaclass): ... generated_class = type("GeneratedClass", (Inherit

解答如何使用元类为静态/类属性实现
\uuuu getattr\uuuu
。但是,我想为
type()
生成的类实现
\uuuu getattr\uuuu
\uuu getattribute\uuuuu
,并且为了让事情更有趣,该类继承了一个类,该类具有必须正确执行的自定义元类

总结上述段落的代码:

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__

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

只要让您的元类继承自某个FancymetClass,在那里正确地实现
\uuu getattr\uuuuuu
(和
\uu getattribute\uuuuuu
)并使用这个元类,而不是调用
type
,来生成您固有的动态类

虽然您使用了很多seldon使用过的东西,但是没有特殊的机制-它应该是纯Python-

当然,您没有告诉我们在元类特殊方法中要做什么-可能会有一些黑魔法需要执行-如果您正在执行
\uuuu getattribute\uuuu
,您必须格外小心,并将所有不关心的属性重定向到super调用,否则,一切都不起作用

另外,请记住,这两种方法可能实现的属性访问自定义不会“创建神奇的dunder方法”-也就是说:您的类不会神奇地拥有一个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu添加
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,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,), {})

你需要在元类上实现
\uu getattr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,并且
您的_getattr\u impl
应该有一个签名
(self,name)
self
,而不是
cls
,因为类的实例在使用时将被传递),除非您希望在元类级别这样做。另外,您确实不需要元类来为dunder函数动态创建具有自定义属性的类。你到底想实现什么?@metatoaster他们正试图在元类上实现那些sunder方法,这样它就可以与类一起工作attributes@juanpa.arrivillaga我可以看到这一点,但除非有充分的理由这样做,否则重写元类和使用动态类构造几乎总是过火。我的观点是建议OP采用一种技术,除非有充分的理由同时使用这两种技术。你应该能够使用
MyCustomMeta(…,…,…)
,就像你使用
type(…,…,…,…)
一样,但他们只需要实际实现
MyCustomMeta
,我的意思是,所有这一切可能都太过了。为什么现在停止。。。