python - 如何在 python 中编写模块私有(private)/ protected 方法?

标签 python private protected

我知道要编写您使用的 python 模块私有(private)/ protected 函数

def _func():
    ...

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

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

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

我的用例是一组 Markdown 标签对象,用于生成类似“树”的结构,该结构可以转换为正确的 Markdown 字符串。每个标签都覆盖一个 protected 方法来转换自身和它包含的标签,有些覆盖一个方法来检查子标签是否有效(例如没有嵌套的粗体)。只有顶层标签上下文有一个公共(public)方法来转换树。

编辑:

IntelliJ IDEA 警告:

访问类_方法的 protected 成员

最佳答案

澄清一下:

  • 如果名称以一个下划线开头,则它是“ protected ”。
  • 如果名称以两个下划线开头但不以两个下划线结尾,则它是“私有(private)的”。

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

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

也就是说,您收到的警告是什么?在下面的示例中,pylint 不会警告我在 Test 类中使用 _func,但我确实在最后一行收到警告 (W0212)。您是否忘记在基类中定义 protected 函数?

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 中编写模块私有(private)/ protected 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23151400/

相关文章:

c++ - 无法访问 C++ 中类模板继承第二级上的 protected 类成员

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

python - 日期时间 'has no attribute now'

Ruby - 从另一个方法中提取我的较小方法(将字符串转换为两个数字和一个符号)

python - 找到最大化正确多数决定数量的预测子集

java - 仅仅为了更容易测试而将私有(private)方法变为非私有(private)方法可以吗?

linux - 如何导入SSH私钥?

java - Java 中重写的方法可见性

python - Scrapy Spider 验证和迭代

python - 如何管理数据库连接,尤其是在多线程的情况下