2017-07-18 4 views
3
class Test(object): 

    def __init__(self): 
     pass 

    def testmethod(self): 
     # instance method 
     self.task(10)  # type-1 access class method 

     cls = self.__class__ 
     cls.task(20)  # type-2 access class method 

    @classmethod 
    def task(cls,val) 
     print(val) 

私はクラスメソッドをインスタンスメソッドにアクセスする2つの方法があります。クラスメソッドをインスタンスメソッドにアクセスする最善の方法

self.task(10) 

または

cls = self.__class__ 
cls.task(20) 

私の質問は最高の理由であるものです?

両方の方法が同じでない場合、どちらの条件で使用するのですか?

+5

また、2つのライナーの代わりに、そのメソッド内から 'Test.task(20)'を直接呼び出すこともできます。 – xgord

+2

@xgord:はい、2つは同等ではありません。 'Task.task(20)'は常に 'Task'で定義された' task'を呼び出しますが、* subclass *はメソッドをオーバーライドできます。その場合、 'SubTask'クラスの' self.task(20) 'は' SubTask.task(20) 'にアクセスします。 –

+1

これは目的に応じて変わります。 'self'は常に現在のインスタンスのメソッドを参照し、継承チェーンだけでなく(クラス名で呼び出すことに比べて、' Test.task() ')、ピックアップクラスの型を参照しながら、最新のオーバーライド、さらには動的クラスも常に実際のクラスメソッドを指します。 'your_instance.task = some_dynamic_override'を設定することを止めるものはありません。そして、' self.task() 'がその関数を呼び出すでしょう。 – zwer

答えて

2

self.task(10)は間違いなく最高です。

まず、双方が最終的にクラスのインスタンスで同じ操作で終了します:Python reference manual/Data model/The standard type hierarchy

  • __class__はクラスインスタンスオブジェクトのために存在することが保証され、オブジェクト(REFのクラスである特別な属性であります)

クラスのインスタンス
...
特殊属性:__dict__は属性の辞書です。

:__class__(:REFマニュアルの同じ章REF)インスタンスのクラス実際メソッドにオブジェクトのクラスを渡すクラスインスタンスオブジェクトとクラスメソッドを呼び出す

  • あります...クラスまたはインスタンスからクラスメソッドオブジェクトを取得してインスタンスメソッドオブジェクトを作成する場合、その__self__属性はクラスそのものです。

しかし、最初のi特別な属性の使用を必要としません。

関連する問題