簡體   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