1

私は良いプログラミングの練習をしたいので、私はこの質問にちょっと立ち往生しています:

私がクラスルートを持っているとしましょう、

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()、Cherryクラスで有効です(グッドプラクティス)。

4

2 に答える 2

0

できますが、この例では、を呼び出す方がよいでしょうstr(another_tree)。一般に、それらの実装に特に関連する何かをしている場合を除いて、二重アンダースコアメソッドを直接呼び出すべきではありません(たとえば、サブクラス実装内からスーパークラス実装を呼び出す)。ほとんどの場合、二重アンダースコアメソッドは、クラスをより「通常の」コンテキストで特定の方法で動作させるために存在します。通常の目的では、その通常のコンテキストを使用する必要があります。たとえば__str__、クラスを呼び出すときにクラスが正しいことを実行できるようにするために存在するため、直接呼び出すのではなく、クラスを呼び出すstr()必要があります。str()__str__

単一アンダースコアメソッドに関しては、作成しない限り、一般的にそれらを呼び出すことはお勧めできません。これを行うための「ペナルティ」はありませんが、慣例により、単一のアンダースコアは、パブリックAPIの一部ではないメソッドを示します。したがって、それらを使用する場合、使用しているライブラリが更新され、それらの下線メソッドが消えたり変更されたりすると、コードが破損するリスクがあります。

于 2012-08-02T02:22:02.930 に答える
0

これは、これらのクラスのメソッドの論理インターフェイスとして設計で宣言されている内容によって異なります。

どういうわけか、どこかで非インスタンスを返すことを指定した場合、あなたが行うことは完全に問題ありません。メソッドがCherryのインスタンスを返すという暗黙の期待を作成していて、Oakを返す場合は、重大なバグの余地があります。

一般に、__method__クラスの内部動作と再キャストのために規則を予約します。

于 2012-08-02T02:23:36.613 に答える