2012-02-14 9 views
4

私は@classmethodデコレータを忘れてしまったので、オーバーライドされたメソッドが隠されたコードのバグを発見しました。Pythonはクラスメソッドをインスタンスメソッドでオーバーライドします

class Super: 

    @classmethod 
    def do_something(cls): 
    ... 

class Child: 
    def do_something(self): 
    ... 

obj = Child() 
obj.do_something() #calls the child 
Child.do_something() #calls the Super method 

EDIT:それは他の方法(それはおそらく悪いデザインだ注意)が、何かのように強制することができます場合、私はさまよった瞬間にない特定の場合をそれが仮に行うことができる場合、私はさまよいました。

+4

これはひどいデザインのように思えます。あなたのユースケースは何ですか?多分もっと良いものを提供することができます。 – Daenyth

+1

シンプルなPythonプログラムを試してみることをお勧めします。テストよりも言語やライブラリの動作を理解するのに役立つものはありません。 – japreiss

+0

「新しい」スタイルクラスの使用を開始したいかもしれません。 – Marcin

答えて

3

、これは一つの方法かもしれない

>>> obj = Child() 
>>> obj.do_something() 
Child Doing Something 
>>> Child.do_something() 
Super doing something 
>>> obj.do_something() 
Child Doing Something 
1

クラスメソッドを、そのクラスのインスタンスを引数として取る別のクラスメソッドでオーバーライドできます。その方法では、あなたがしなければならないことを行い、それを返す。そうすることができるのです

しかし、私はそれをまったく行うことはお勧めしません。

class Super: 
    @classmethod 
    def do_something(cls): 
    print('Super doing something') 

class Child(Super): 
    def __init__(self): 
     self.do_something = lambda: print('Child Doing Something') 

例:純粋仮想的にアプリケーションとして

関連する問題