繁体   English   中英

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

[英]Accessing private methods from inherited class in python

我想遵循良好的编程习惯,所以我有点被这个问题困扰:

可以说我有Class Root,

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'

然后在课堂樱桃中,我可以做以下事情吗

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()

基本上调用__str__() _new_fun()_test()在樱花类有效的(好习惯)。

您可以,但是在此示例中,最好只调用str(another_tree) 通常,除非您要进行与它们的实现特别相关的操作(例如,从子类实现中调用超类实现),否则不应直接调用double-underscore方法。 通常,双下划线方法的存在是为了让类在更“正常”的上下文中以某种方式运行,并且您应出于正常目的使用该正常上下文。 例如,存在__str__以便在类上调用str()时让类做正确的事情,因此应在其上调用str()而不是直接调用__str__

至于单下划线方法,除非您编写了这些方法,否则通常不建议调用这些方法。 这样做没有“惩罚性”,但是按照惯例,单个下划线表示不属于公共API的方法。 因此,如果使用它们,则如果所使用的库已更新并且那些下划线方法消失或更改,则冒着代码中断的风险。

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

如果您以某种方式在某处指定要返回非实例,那么您所做的一切就很好。 如果创建隐式期望,则该方法将返回Cherry的实例,而您将返回Oak,则将为严重的bug引入空间。

通常,为类的内部工作和重铸保留__method__约定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM