【问题标题】:Python private method for public usage供公众使用的 Python 私有方法
【发布时间】:2018-04-25 21:39:06
【问题描述】:

我有一个需要实现方法 meth() 的 A 类。 现在,我不希望我的包的最终用户调用此方法。因此,我必须将此方法设为私有(即 _meth()。我知道它不是真正私有的,但约定很重要。)

但问题是我的包中还有另一个 B 类,它必须调用该方法 _meth()。问题是我现在得到一个警告方法,说 B 试图访问一个类的受保护方法。因此,我必须公开该方法,即没有前导下划线。这与我的意图相矛盾。

解决这个困境最pythonic的方法是什么?


  • 我知道我可以在 A 之外重新实现该方法,但它会导致代码重复,并且由于 meth() 使用 A 的私有属性,会导致同样的问题。

  • 从单个元类继承不是一种选择,因为这些类具有完全不同的目的,这将导致一团糟。

【问题讨论】:

  • 是否可以创建 A 类的对象或将其传递给 B 类?
  • 也许你会在编辑器中收到警告,但无论如何你都可以调用该方法。
  • @Matthias 当然可以,但我希望我的脚本尽可能接近 PEP,并且不显示任何警告。
  • @VPfB 是的,但这仍然是非pythonic - 一个不打算调用的公共方法。
  • @tobias_k 不,问题是如何以 Python 的方式进行操作,而不是如何禁用 IDE 警告。

标签: python python-3.x private-members


【解决方案1】:

pylint/您的编辑器/任何外部工具都会向您发出警告这一事实并不会阻止代码执行。我不知道你的编辑器,但 pylint 警告 can be disabled on a case-by-case basis using special comments (nb:“case by case”意思是:“不要警告我 this 行或块”,而不是“完全禁用此警告” )。

您自己的代码完全可以访问同一个包中的受保护属性和方法 - “_protected”命名约定并不意味着“不会通过”,只是“你确定你了解你在做什么,如果你破坏了某些东西,你愿意承担责任吗?”。由于您是包的作者/维护者,并且这些是包内访问权限,因此您显然有权承担此责任;)

【讨论】:

  • 我知道,但我仍然想解决这个冲突,以便我的编辑器的右侧选项卡显示成功的刻度,而不是紫色警告符号。
  • @AntonBohdanov 那么你必须找出你的编辑使用的 linter,这样你才能告诉他你知道你在做什么。
  • 我仍然想解决问题,而不仅仅是禁用警告
  • @AntonBohdanov 这实际上不是问题 - 访问受保护方法的代码位于同一个包中,你确实知道你在这里做什么,没关系。 “_protected”命名约定并不意味着“不会通过”,只是“你确定你明白你在做什么,并且如果你破坏了某些东西愿意承担责任吗?”。除非您的编辑器的 linter 完全脑残,否则您应该能够only 对这一行的警告静音。
  • 感谢您的澄清。我认为您应该编辑您的初始答案以反映此评论。然后我认为这是我正在寻找的解决方案。我会让这个答案被接受。
猜你喜欢
  • 2014-03-19
  • 2022-11-17
  • 1970-01-01
  • 2019-08-26
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多