2012-08-02 62 views
1

我要遵循良好的编程习惯,所以我有点停留在这个问题:访问来自继承类的私有方法在python

可以说我有类根,

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

    def __str__(self): 
    return self._root_tree 

    def _test(self): 
     return 'test' 

可以说,我创建一个名为橡树

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

基本上在Cherry类中调用__str__()_new_fun()_test()有效(良好做法)。

+3

那么...又是什么问题? – 2012-08-02 02:17:01

+0

'Cherry'类方法不访问它们自己实例的超类的私有方法,它们正在访问那些通过额外参数(即非自身属性)传递给它们的实例的方法。这打破封装。 – martineau 2012-08-02 03:13:06

回答

0

你可以,但在这个例子中,最好只打str(another_tree)。一般来说,除非你正在做一些与它们的实现特别相关的事情(例如,在子类实现中调用一个超类实现),否则不应该直接调用双下划线方法。大多数情况下,双下划线方法的存在是为了让该类在更“正常”的上下文中以某种方式运行,并且您应该将正常上下文用于正常目的。例如,__str__的存在是为了让班级在您拨打str()时做正确的事情,所以您应该拨打str(),而不是直接拨打__str__

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

+0

关于调用特殊方法的好处,但是如何调用另一个实例的私有方法,那些以单个下划线开始的方法呢? – martineau 2012-08-02 03:09:43

0

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

如果你以某种方式指定你要返回非实例,那么你所做的是非常好的。如果您创建隐式期望,该方法返回Cherry的实例,并且您返回Oak,那么您将为严重错误引入空间。

一般来说,保留__method__约定为您的班级的内部工作和重铸。