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

Posted

技术标签:

【中文标题】如何在 python 中编写模块私有/受保护的方法?【英文标题】:How do I write module private/protected methods in python? 【发布时间】:2014-06-02 19:15:48 【问题描述】:

我知道要编写你使用的 python 模块私有/受保护函数

def _func():
    ...

但我有一个带有专门覆盖的对象层次结构。另外我想隐藏内部实现(因为它不是供外部使用的,所以我希望可以在不破坏代码的情况下改进它,而不是我认为除了我之外的任何人都会使用它)。如果我使用

class Paragraph(Tag):
    def _method(self):
        ...

并尝试从子类标记 IntelliJ IDEA 的不同类中调用 _method(并且可能 pylint/其他检查器也会)给我一个警告。有没有办法解决这个问题?

我的用例是一组 markdown 标记对象,用于生成类似“树”的结构,可以将其转换为正确的 markdown 字符串。每个标签都会覆盖一个受保护的方法来转换自己和它包含的标签,还有一些会覆盖一个方法来检查子标签是否有效(例如没有嵌套的粗体)。只有***标签上下文具有转换树的公共方法。

编辑:

IntelliJ IDEA 警告:

访问类_method的受保护成员

【问题讨论】:

“冒犯”的电话是什么样的? 为什么不直接忽略 Intellij 警告?顺便说一句,Pylint 不会在乎这种电话。这只是一个约定,从它的声音来看,您正确地使用了约定。 可能重复:***.com/questions/1301346/… 我不认为它是重复的。 【参考方案1】:

澄清一下:

如果名称以下划线开头,则为“受保护”。 如果名称以两个下划线开头但不以两个下划线结尾,则为“私有”。

'Protected' 只是一个约定,但语法检查器确实会在类层次结构之外访问它们。

'Private' 是通过名称修饰实现的,因此该元素只能在定义它的类中使用。两个下划线替换为_<name of class>__。有一些技巧可以规避这个...

也就是说,您收到的警告是什么?在下面的示例中,pylint 没有警告我在 Test 类中使用 _func,但我确实在最后一行收到警告 (W0212)。你忘了在基类中定义受保护的函数吗?

class Test(object):
  ''' . '''
  def _func(self):
    ''' . '''
    raise NotImplementedError()
  def fun(self):
    ''' . '''
    self._func()

class Demo(Test):
  ''' . '''
  def _func(self):
    ''' . '''
    print 'Hi'

t = Demo()
t._func()

【讨论】:

问题是python中缺少类型提示,它可能无法判断它们是层次结构的一部分。

以上是关于如何在 python 中编写模块私有/受保护的方法?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以为具有 1)返回类型 void、2)访问说明符私有或受保护的方法编写单元测试?

私有/受保护的方法是不是应该进行单元测试? [关闭]

用于私有/受保护方法的 JavaDoc? [关闭]

我应该对私有/受保护方法进行单元测试吗

编写python高质量python代码的59个有效方法

C#:在密封类中模拟和测试受保护(或私有)方法——方法