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
,我的意思是,所有这一切可能都太过了。为什么现在停止。。。