dunder方法是继承的吗?

时间:2017-06-08 20:10:22

标签: python inheritance

如果我在父类中定义__getstate__()__setstate__(),孩子是否能够继承这些方法?在this SO answer中有一些相关的讨论,但只有前面的双下划线(dunder)的方法。

一些额外信息:

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

1 个答案:

答案 0 :(得分:5)

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

  

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

这是来自__* class-private 名称的单独的类

和链接的其他部分是Identifiers (Names),这可能更清晰:

  

如果在类定义中以文本方式出现的标识符以两个或多个下划线字符开头,并且不以两个或多个下划线结尾,则会将其视为私有名称那个班。

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

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