在python中从继承的类访问私有方法

在python中从继承的类访问私有方法,python,class,inheritance,Python,Class,Inheritance,我想遵循良好的编程实践,因此我有点被以下问题困扰: 假设我有类根 Class root(Object): def __init__(self): self._root_tree = 'Base' def __str__(self): return self._root_tree def _test(self): return 'test' 假设我创建了一个名为Oak的类 Class Oak(root): def __str__(se

我想遵循良好的编程实践,因此我有点被以下问题困扰:

假设我有类根

Class root(Object):
   def __init__(self):
     self._root_tree = 'Base'

   def __str__(self):
     return self._root_tree

   def _test(self):
      return 'test'
假设我创建了一个名为Oak的类

Class Oak(root):
    def __str__(self):
      return 'Oak'
    def _test(self):
      return 'Oak_test'
    def _new_fun(self):
      return 'new_func_only_in_oak'
那么在课堂上,Cherry,我能做下面的事情吗

Class Cherry(root):
    def _grab_trees(self,another_tree): #another_tree is a Oak object
      other_tree = another_tree.__str__() #this will return Oak
      return 'The other three is: ' + other_tree
    def _test2(self,another_tree):
      return another_tree._test()
    def _testing_new(self,another_tree):
      return another_tree._new_fun()

基本上,在Cherry类中调用
\uu str\uu()
\u new\u fun()
\u test()
是有效的(良好实践)。

您可以,但在本例中,最好只调用
str(另一棵树)
。通常情况下,除非您正在执行与其实现相关的特定操作(例如,从子类实现中调用超类实现),否则不应直接调用双下划线方法。大多数情况下,双下划线方法的存在是为了让类在更“正常”的上下文中以某种方式运行,您应该出于正常目的使用该正常上下文。例如,
\uuuu str\uuuu
的存在是为了让类在调用
str()
时做正确的事情,因此您应该在类上调用
str()
,而不是直接调用
\uu str


对于单下划线方法,除非您编写了它们,否则调用它们通常不是一个好主意。这样做没有“惩罚”,但按照惯例,单下划线表示不属于公共API的方法。因此,如果您使用它们,那么如果您正在使用的库被更新,并且下划线方法消失或更改,那么您将面临代码中断的风险。

这取决于您的设计将什么声明为这些类的方法的逻辑接口

如果您不知何故,在某个地方指定返回非实例,那么您所做的是完全正确的。如果您创建的是隐式期望,即方法返回Cherry的实例,而您返回的是Oak,那么您就为严重的bug引入了空间


一般来说,为类的内部工作和重铸保留
\uuuuu方法\uuuu
约定。

。。。问题又来了。
Cherry
类方法并没有访问它们自己实例超类的私有方法,它们正在访问通过额外参数(即非自属性)传递给它们的某个实例的私有方法。这破坏了封装。调用特殊方法的好处是什么,但调用另一个实例的私有方法(那些以一个下划线开头的方法)又如何呢?