样式问题:包装中的单个前划线

时间:2019-11-28 17:06:14

标签: python inheritance naming-conventions pep8

Python PEP 8 style guide针对方法名称中的单个前划线提供了以下指导:

  

_single_leading_underscore:“内部使用”指标较弱。例如。从M import *不会导入名称以下划线开头的对象。

什么是“内部使用”? 这是仅在给定类中调用的方法吗?

MyClass:

    def _internal_method(self):
        # do_something

    def public_method(self):
        self._internal_method()

继承的方法如何-它们仍然被认为是“内部”的吗?

BaseClass:

    def _internal_method(self):
        # do something

MyClass(BaseClass):

    def public_method(self):
        self._internal_method()  # or super()._internal_method()

如果继承来自软件包中的另一个模块怎么办?

file1.py

BaseClass:

    def _internal_method(self):
        # do something

file2.py

from file1 import BaseClass

MyClass(BaseClass):

    def public_method(self):
        self._internal_method()  # or super()._internal_method()

所有这些示例在技术上都不错,但是在样式上它们都可以接受吗?您在什么时候说下划线不是必需的/无益的?

1 个答案:

答案 0 :(得分:1)

Python的“私有”和“受保护”变量的约定是一个下划线,可以用其他一些语言的硬实现形式提供。

“内部使用”语言是指您保留该名称(作为开发人员),以供您的代码随意使用,而模块/代码的其他用户则不能依赖与之相关的事物该名称在以后的版本中甚至会存在相同的行为。它只是“受保护”属性的用例,但没有语言运行时的硬实现:用户应该知道可以更改属性/功能/方法而无需事先发出警告。

因此,,只要使用您的_前缀方法的其他类在同一代码包中-即使在其他文件或文件夹(其他完全不同的包)中,可以使用它们。

如果您有不同的Python软件包,即使它们紧密相关,也不建议在样式上直接调用其他软件包的内部内容。

至于限制,有时有些类的用户不应该使用整个模块和类-并且在这些模块的所有内容前面都加上一个_会有所损害-我是d说,足以记录用户应该调用的程序包的公共接口,并在文档上添加某些部分(模块/类/功能)设计为“内部使用并且可以更改而无须注意”的文档-无需插上他们的名字。

作为说明,我目前正在开发一个set of tools/library for text-art on the terminal-我将用户应将其称为公用名称的所有内容都放在其__init__.py中-其余名称应为“内部”。