【问题标题】:Are dunder methods inherited?dunder 方法是继承的吗?
【发布时间】:2017-11-10 16:49:06
【问题描述】:

如果我在父类中定义__getstate__()__setstate__(),子类可以继承这些方法吗? this SO answer 中有一些相关的讨论,但仅限于前面带有双下划线 (dunder) 的方法。

一些额外的信息:

  • 我这样做是为了定义我的类的序列化(酸洗)行为。
  • Python 2.7

【问题讨论】:

  • @MSeifert 类私有名称(即__*)被重新编写,以使用错位形式来帮助避免基类和派生类的“私有”属性之间的名称冲突。我不确定 dunder dunder 方法是否属于这条船。
  • 不,他们没有——因为他们没有归类为“私有属性”(这些被定义为“至少两个前导下划线,最多一个尾随下划线”):见docs.python.org/2/tutorial/…

标签: python inheritance


【解决方案1】:

是的,dunder 方法可以很好地继承。从那里的答案来看,链接的文档是Reserved classes of identifiers

__*__
系统定义的名称。这些名称由解释器及其实现(包括标准库)定义。当前系统名称在特殊方法名称部分和其他地方讨论。在 Python 的未来版本中可能会定义更多内容。 任何__*__ 名称的使用,在任何情况下,如果不遵循明确记录的使用,可能会在没有警告的情况下被破坏。

这是一个与__* class-private 名称​​独立的类

链接的另一部分是Identifiers (Names),这可能更清楚:

当以文本形式出现在类定义中的标识符以两个或多个下划线字符而不以两个或多个下划线结尾时,它被视为私有名称那个班的。

大胆强调我的;以两个下划线开头并以两个下划线结尾的名称不是 class-private 名称。

请注意,两个类的名称都是继承的(继承通过在类的 MRO 中查找属性名称来工作)。名称被破坏并不能阻止它们被继承,这就是为什么首先名称被破坏的原因。通过在这些名称前加上 _ClassName 前缀,子类可以重复使用该名称并且自动不会发生冲突,因为它们有自己的 _SubClass 前缀。

【讨论】:

  • @BoltzmannBrain:这两类名称都可以很好地继承;这个名字是mangled,不是隐藏的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 2011-12-15
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
相关资源
最近更新 更多