如何在 Python 类中表示受保护的方法?

Posted

技术标签:

【中文标题】如何在 Python 类中表示受保护的方法?【英文标题】:How to represent protected methods in Python classes? 【发布时间】:2016-08-26 08:28:42 【问题描述】:

阅读this question on method ordering,我想到了将受保护的方法放在哪里以及它们在Python中应该是私有的_method(self)还是公共的method(self)。我知道 Python 没有为受保护的方法提供语言特性。

私有:按照惯例,以下划线开头的属性是私有的。它们通常仍然可以从外部访问,但不应该。用下划线开头的受保护方法感觉很奇怪,因为不清楚子类实际上覆盖了方法,而不是声明了自己的实现细节。

Public: 如果没有下划线,则更有可能有人会查看基类以查看该方法是否已经存在。因此,这对于子类化的人来说更好。但是,想要使用子类的人并不知道该方法只是一个实现细节,可能会尝试从外部调用它。

在 Python 中定义受保护方法的首选方法是什么?

【问题讨论】:

另见 Why are Python's 'private' methods not actually private? 正如 Guido 所说:“我们都是同意的成年人”。 【参考方案1】:

只需使用以下划线开头的名称。

受保护的方法是您希望与子类共享的实现细节,因此此类方法不是公共 API 的一部分。任何不属于公共 API 的内容最好使用初始下划线命名。

换句话说,“受保护”应该与“私人”一样对待。受保护的方法只需要以具有严格隐私模型的语言存在,其中将此类实现细节设为私有将排除与子类共享此类方法。 Python没有这样的问题。

无论你做什么,不要使用前导下划线;此类名称被视为类私有,并被命名为定义它们的类(编译器通过在前面添加前缀_ClassName 对其进行重命名),以确保子类不会意外覆盖它们。

【讨论】:

以上是关于如何在 Python 类中表示受保护的方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 proto 文件中表示接口实现

如何从 Ruby 中的实例方法访问受保护的类方法?

如何在 Python 中表示无限数?

Python中的“受保护”访问 - 如何?

如何在 Angular 类中表示嵌套的 JSON?

如何在 python 中编写模块私有/受保护的方法?