python3中的“super”对象没有属性“\uuuu getattr\uuuuuu”

如何用Python3和继承重写\uuuu getattr\uuuu

当我使用以下命令时:

混合类:
def _uGetAttr _;(自身,项目):
#处理项目和返回值(如果已知)
如果项目=='a':
返回“MixinA”
#如果不知道,就把它传给别人
#一个机会到另一个班级去处理它
返回super()。\uuuu getattr\uuuuu(项)
类别MixinB:
def _uGetAttr _;(自身,项目):
#处理项目和返回值(如果已知)
如果项目==“b”:
返回“MixinB”
#如果不知道,就把它传给别人
#一个机会到另一个班级去处理它
返回super()。\uuuu getattr\uuuuu(项)
类示例(MixinA、MixinB):
#主类
通过

我得到这个错误

&gt&燃气轮机&燃气轮机;e=示例()
&燃气轮机&燃气轮机&燃气轮机;e、 a
“米西娜”
&燃气轮机&燃气轮机&燃气轮机;e、 b
“MixinB”
&燃气轮机&燃气轮机&燃气轮机;e、 c
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
...
AttributeError:“super”对象没有属性“\uuu getattr\uuuu”

我不能直接获取引用原始类和属性的属性错误吗?也就是说:

AttributeError:“示例”对象没有属性“c”

附言:我找到了这篇文章'超级'对象未调用u_getattr_u_,但我不确定是否有解决方案

Python属性检索机制的工作方式是将类\uuuu getattr\uuuu称为“最后一个资源”,以尝试获取该类实例的属性

您的代码是正确的-它失败的原因是您的超类“Example”-在本例中是“object”-没有\uu getattr\uu属性。
如果您不在深层类层次结构中,并且希望对直接从对象继承的类执行自定义属性检索(在Py3中,可以像代码中一样表示为完全没有基)-如果自定义查找失败,只需引发“AttributeError”

如果您的目的是使您的自定义搜索优先于Python的常规属性检索机制(而不是作为回退机制调用),那么您应该实现\uuu getattribute\uuuuuuu而不是\uu getattr\uuuuu

在这种情况下,基类object确实有一个\uuuu getattribute\uuuu方法,您必须为普通的属性检索调用它-问题是您必须为您想要的所有内容调用它,包括方法名和您设置的已知属性。i、 e:有什么进展:

类示例:
定义初始化(自):
self.attrs_to_override=[“attr1”、“foo”、“bar”]
def docustomstuff(自身、属性):
...
定义获取属性(自身,属性):
getter=super()__
如果getter中的attr(“attrs\u to\u override”):
getter(“docustomstuff”)(attr)
返回getter(attr)

简而言之,如果您认为应该实现\uuuu getattribute\uuuu而不是\uuuu getattr\uuuu,那么您可能尝试了错误的方法,除非是在非常特定的情况下。到目前为止,您可能还不知道:\uuuu getattr\uuuu如果所需名称的普通属性不存在,则不会被调用,因此无需在超类中调用它(除非case中的超类不是对象,并且具有已知的自定义)

编辑

或者,只需以最简单的方式检查下一个超类是否有\uuu getattr\uuuu

。。。
如果hasattr(super(),“\uuuu getattr\uuuuu”):
返回super()。\uuu getattr\uuu(attr)
提高属性错误

发表评论