1

の数で、私は特定の方法でBaseクラスを持ち、ワット/任意のパラメータO:矛盾がベースのパラメータと子のメソッドシグネチャ

class Base(): 

    def pretty_method(self): 
     print('Hi!') 

そしてそこにいくつかのサブクラスがあり、彼らは新しいとpretty_methodで追加の手続きが必要パラメータx

class A(Base): 

    def pretty_method(self, x): 
     super().pretty_method() 
     print('X in A is {}'.format(x)) 

class B(Base): 

    def pretty_method(self, x): 
     super().pretty_method() 
     print('X in B is {}'.format(x)) 

したがって、私はクラスメソッドのシグネチャに矛盾があります。

class Base(): 

    def pretty_method(self, x=None): 
     print('Hi!') 

ちょっと無用であるが、一貫性に署名を保持します。私は、基本クラスの未使用xパラメータを扱うことができ、他の手で

。 もっと好ましいアプローチは何ですか?

+2

この場合、一貫性は必要ありません。このメソッドをオーバーライドして、なぜそれが基本クラスのメソッドと同じシグネチャを持つべきなのですか? – Kasramvd

答えて

1

新しい属性/メソッドを派生クラスに追加すると問題はありません。削除するには、Liskov substitution principleに違反しているためではありません。

(現代の)Pythonのすべてのクラスはobjectから派生し、新しい属性& /またはメソッドを追加しなかった場合は役に立たなくなります。したがって、派生クラスの__init__メソッドに新しいargsを追加するのは完全に正常です。

もちろん、派生クラスの大部分がx引数を使用すると予想される場合は、基本クラス自体にもそれを使用していないにもかかわらず、それを完全に基底クラスに追加しても問題ありません。

関連するノートでは、基本クラス自体が使用しないが派生クラスがオーバーライドすると予想されるメソッドを基本クラスに追加するのが一般的です。そのような場合、基本メソッドがNotImplementedを呼び出すのは正常です。 にはが必要です。基本クラスにそのようなメソッドを提供するのではなく、派生クラスでメソッドを提供することを忘れた場合にエラーメッセージをより有益にします。