python - 区分外部调用的对象方法和子类调用的对象方法的约定是什么?

标签 python subclass private

我知道 Python 处理私有(private)变量/成员/函数/...的大部分细节

但是,我无法决定如何区分外部使用方法或子类使用方法。

考虑以下示例:

class EventMixin(object):
    def subscribe(self, **kwargs):
        '''kwargs should be a dict of event -> callable, to be specialized in the subclass'''

    def event(self, name, *args, **kwargs):
        ...

    def _somePrivateMethod(self):
        ...

在这个例子中,我想说明的是,subscribe 是一种供类/对象的外部用户使用的方法,而 event 是一种不应从外部调用的方法,而应由子类实现调用。

现在,我认为这两个部分都是公共(public) API,因此不使用任何下划线。但是,对于这种特殊情况,例如,外部 API 不使用下划线,可子类 API 使用一个下划线,私有(private)/内部 API 使用两个下划线会感觉更简洁。然而,这会变得很笨重,因为这样内部 API 就需要被调用为

self._EventMixin__somePrivateMethod()

那么,您的约定是什么,编码方式、文档方式或其他方式?

最佳答案

use no underscores for the external API,
one underscore for the subclassable API,
and two underscores for the private/internal API

这是一种合理且相对常见的做法,是的。双下划线表示实际私有(private)(与 C++ 术语中的“ protected ”相反)在实践中很少见。您永远不知道子类可能想要覆盖哪些行为,因此假设“ protected ”通常是一个不错的选择,除非有充分的理由说明与成员打交道可能特别危险。

However, that would become unwieldy because then the internal API would
need to be invoked as self._EventMixin__somePrivateMethod()

不,你可以只使用双下划线版本,它会被自动修改。它很丑陋,但它有效。

关于python - 区分外部调用的对象方法和子类调用的对象方法的约定是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/236359/

相关文章:

css - 强制为选择器使用样式,无论它在 dom 中的哪个位置

python - 关于将 celery 与带有远程存储的 sorl-thumbnails 一起使用的指示?

python - 如何从 matplotlib 图表中删除科学记数法?

python - 为什么 `__subclasshook__` 可以被猴子修补到元类上,而 `__instancecheck__` 不能?

python - 避免在子类中指定所有参数

c++ - 构造函数 Parent 在构造函数 Child 的初始化列表中被调用

python - 如何在 CentOS 5.5 中手动安装 Python 模块?

python - 过滤 RDD 中的数据

Java 多态性与 ArrayList

iphone - 请求访问联系人的权限