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

时间:2014-04-18 09:36:52

标签: python private protected

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

def _func():
    ...

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

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

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

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

编辑:

IntelliJ IDEA警告:

访问类_method

的受保护成员

1 个答案:

答案 0 :(得分:5)

澄清:

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

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

'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()
相关问题