Python 邓德方法是继承的吗?
如果我在父类中定义Python 邓德方法是继承的吗?,python,inheritance,Python,Inheritance,如果我在父类中定义\uuuu getstate\uuuuuuu()和\uuuu setstate\uuuuuuuuu(),子类是否能够继承这些方法?中有一些相关的讨论,但仅限于前面带有双下划线(dunder)的方法 一些额外信息: 我这样做是为了定义类的序列化(酸洗)行为 Python 2.7 是的,dunder方法继承得很好。根据答案,链接的文档是: \uuu*\ uuuuuuu 系统定义的名称。这些名称由解释器及其实现(包括标准库)定义。在特殊方法名称部分和其他地方讨论了当前系统名称。更多
\uuuu getstate\uuuuuuu()
和\uuuu setstate\uuuuuuuuu()
,子类是否能够继承这些方法?中有一些相关的讨论,但仅限于前面带有双下划线(dunder)的方法
一些额外信息:
- 我这样做是为了定义类的序列化(酸洗)行为
- Python 2.7
\uuu*\ uuuuuuu
系统定义的名称。这些名称由解释器及其实现(包括标准库)定义。在特殊方法名称部分和其他地方讨论了当前系统名称。更多可能会在Python的未来版本中定义。在任何上下文中使用
\uu*\ uu
名称,如果不遵循明确记录的使用,则会在没有警告的情况下被破坏
它是一个独立于\uu*
类私有名称的类
另一个相关部分可能更清楚:
当类定义中以文本形式出现的标识符以两个或多个下划线字符开始,而不是以两个或多个下划线结束时,它被视为该类的私有名称
大胆强调地雷;以两个下划线开头并以两个下划线结尾的名称不是类私有名称
请注意,这两类名称都是继承的(继承通过在类的MRO中查找属性名称来实现)。名称被损坏并不能阻止它们被继承,这就是为什么名称首先被损坏的原因。通过在这些名称前面加上
\u ClassName
子类可以重复使用该名称,并且不会自动冲突,因为它们有自己的\u子类前缀。是的,dunder方法可以很好地继承。根据答案,链接的文档是:
\uuu*\ uuuuuuu
系统定义的名称。这些名称由解释器及其实现(包括标准库)定义。在特殊方法名称部分和其他地方讨论了当前系统名称。更多可能会在Python的未来版本中定义。在任何上下文中使用\uu*\ uu
名称,如果不遵循明确记录的使用,则会在没有警告的情况下被破坏
它是一个独立于\uu*
类私有名称的类
另一个相关部分可能更清楚:
当类定义中以文本形式出现的标识符以两个或多个下划线字符开始,而不是以两个或多个下划线结束时,它被视为该类的私有名称
大胆强调地雷;以两个下划线开头并以两个下划线结尾的名称不是类私有名称
请注意,这两类名称都是继承的(继承通过在类的MRO中查找属性名称来实现)。名称被损坏并不能阻止它们被继承,这就是为什么名称首先被损坏的原因。通过在这些名称前面加上\u ClassName
子类可以重复使用该名称,并且自动不会发生冲突,因为它们有自己的\u子类前缀。@MSeifert类私有名称(即\uuu*
)被重新编写,以使用损坏的表单帮助避免“private”之间的名称冲突基类和派生类的属性。我不确定dunder-dunder方法是否会落到这条船上。不,它们不会——因为它们没有分类为“私有属性”(这些属性被定义为“至少两个前导下划线,最多一个尾随下划线”):请参阅@MSeifert类私有名称(即,\uu*
)被重新编写,以使用一个损坏的表单来帮助避免它们之间的名称冲突基类和派生类的“私有”属性。我不确定dunder-dunder方法是否会落入这条船。不,它们不会——因为它们不会归类为“私有属性”(它们被定义为“至少两个前导下划线,最多一个尾随下划线”):请参阅@BoltzmannBrain:这两类名称继承得很好;名称被损坏,而不是隐藏。@BoltzmannBrain:这两类名称继承得很好;名称被损坏,而不是隐藏。