2017-10-26 6 views
0

私は3つのクラスA,BおよびCを持っています。2つのクラスから継承するオブジェクトメソッドを呼び出す

Aのメソッドは、hello(self)です。 BAから継承し、新しいメソッドhello(self)を実装します。 CBから継承し、メソッドhello(self)を再インプリメントします。

インスタンスb = B()を作成してb.hello()と呼び出すと、それはB.hello(b)のように呼び出されます。

問題は、オブジェクトc = C()を作成し、c.hello()を呼び出すと、C.hello(c)ではなく、実際にはB.hello(c)が呼び出されるという問題です。何故ですか?

私のコードは次のようになります。これは私の作品ではなく、

class A: 
    def hello(self): 
     self.helloHandler() 
    def helloHandler(self): 
     print('class A method') 

class B(A): 
    def helloHandler(self): 
     print('class B method') 

class C(B): 
    def helloHandler(self): 
     print('class C method') 

c = C() 
c.hello() 

。私のコードはこの時点で数千の行を持っています...実際には投稿できませんが、それがポイントです。私は何が問題なのか分かりません。子クラスがいくつかのメソッドを実装するように強制するいくつかのあいまいな理由が重要な場合は、abcmetaを使用します。

編集:私は同じように見える私のオブジェクトの2つを台無しにしました。すべてが必要なように動作します!

+4

コードを投稿してください。 –

+0

メタクラスを使用している場合は、ABCで定義された抽象メソッドから継承された親クラスで定義された具象メソッドをオーバーロードしないでください。 – James

+0

問題としてクローズする投票は再現できません。 – James

答えて

2

問題を再現できません。ここにあなたが定義した設定ですが、BAから継承しますが、そのメソッドはオーバーロードされます。 CBから継承されますが、再度そのメソッドにオーバーロードされます。

Cのインスタンスを作成し、hello()を呼び出すと、Cから正しいオーバーロードされたメソッドが使用されます。

class A: 
    def hello(self): 
     print('class A method') 

class B(A): 
    def hello(self): 
     print('class B method') 

class C(B): 
    def hello(self): 
     print('class C method') 

c = C() 
c.hello() 
# prints 
class C method 
0

私はすべてのクラス間で混乱しました。私は非常に似ている2つのオブジェクトを持っています...すべてが必要なように動作します。

関連する問題