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)
私の質問は最高の理由であるものです?
両方の方法が同じでない場合、どちらの条件で使用するのですか?
また、2つのライナーの代わりに、そのメソッド内から 'Test.task(20)'を直接呼び出すこともできます。 – xgord
@xgord:はい、2つは同等ではありません。 'Task.task(20)'は常に 'Task'で定義された' task'を呼び出しますが、* subclass *はメソッドをオーバーライドできます。その場合、 'SubTask'クラスの' self.task(20) 'は' SubTask.task(20) 'にアクセスします。 –
これは目的に応じて変わります。 'self'は常に現在のインスタンスのメソッドを参照し、継承チェーンだけでなく(クラス名で呼び出すことに比べて、' Test.task() ')、ピックアップクラスの型を参照しながら、最新のオーバーライド、さらには動的クラスも常に実際のクラスメソッドを指します。 'your_instance.task = some_dynamic_override'を設定することを止めるものはありません。そして、' self.task() 'がその関数を呼び出すでしょう。 – zwer