Python中的双下划线方法会被继承吗?

4
如果我在父类中定义了__getstate__()__setstate__(),那么子类能够继承这些方法吗?在这个SO回答中有相关的讨论,但仅适用于以双下划线(dunder)开头的方法。
一些额外的信息:
  • 我正在这样做来定义我的类的序列化(pickling)行为。
  • Python 2.7

@MSeifert 类私有名称(即__*)被重写为使用一种混淆形式,以帮助避免基类和派生类的“私有”属性之间的名称冲突。我不确定双下划线方法是否也属于这个范畴。 - BoltzmannBrain
1
不,它们不是私有属性,因为它们没有被定义为“至少两个前导下划线,最多一个尾随下划线”:请参阅https://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references。 - MSeifert
2个回答

7
是的,dunder方法可以很好地继承。从回答中,链接的文档是保留标识符类

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

这是与__* 类私有名称不同的一个单独的类
而链接的另一部分是标识符(名称),它可能更加清晰:
当在类定义中以两个或多个下划线字符开头且不以两个或多个下划线结尾的标识符在文本上出现时,它被视为该类的私有名称。加粗强调是我的; 以两个下划线开头并以两个下划线结尾的名称不是类私有名称。请注意,这两种名称都是继承的(继承通过在类的MRO中查找属性名称来完成)。名称被修改不会阻止它们被继承,这正是为什么首先要修改名称的原因。通过给这些名称添加_ClassName前缀,子类可以重复使用名称并自动避免冲突,因为这些名称会得到自己的_SubClass前缀。

1
@BoltzmannBrain:两种类别的名称都被很好地继承了;名称被编码,而不是隐藏。 - Martijn Pieters

0

对于未继承的__repr__存在一个例外。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接