如果我在父类中定义__getstate__()__setstate__(),则子代是否可以继承这些方法? this SO answer中有一些相关的讨论,但仅涉及带有双引号(dunder)的方法。

一些额外的信息:


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

最佳答案

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


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


这是与__*类专用名称分开的类。

链接的另一部分是Identifiers (Names),可能仍然更清晰:


  当在类定义中以文本形式出现的标识符以两个或多个下划线字符开头且不以两个或多个下划线结尾时,则该标识符被视为该类的专用名称。


大胆强调我;以两个下划线开头和以两个下划线结尾的名称不是类专用名称。

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

10-05 21:09
查看更多