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

Rom*_*her 4 python private protected

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

def _func():
    ...
Run Code Online (Sandbox Code Playgroud)

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

class Paragraph(Tag):
    def _method(self):
        ...
Run Code Online (Sandbox Code Playgroud)

并尝试从另一个类中调用_method,该类继承Tag IntelliJ IDEA(可能还有pylint /其他检查器)也会给我一个警告.有没有什么办法解决这一问题?

我的用例是一组markdown标记对象,用于生成类似"Tree"的结构,可以将其转换为正确的markdown字符串.每个标签覆盖一个受保护的方法本身以及它所包含的标签和一些覆盖变换的方法来检查子标签是否有效(例如,没有嵌套加粗).只有顶级标记上下文具有转换树的公共方法.

编辑:

IntelliJ IDEA警告:

访问类_method的受保护成员

Eve*_*rtW 5

澄清:

  • 如果名称以一个下划线开头,则为"受保护".
  • 如果名称以两个下划线开头但不以两个下划线结尾,则为"私有".

"受保护"只是一种约定,但语法检查器在类层次结构之外访问它们时会唠叨.

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

那就是说,你得到的警告是什么?在下面的例子中,pylint的不警告我要使用_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()
Run Code Online (Sandbox Code Playgroud)