2017-09-20 13 views
3

基本クラスによって実装される一連のメソッドを定義できる親クラスを作成する最適な方法は何ですか?Pythonの抽象化

クラスAにはmethod_Xの2つのパラメータが必要ですが、クラスBには同じメソッドに対して3つのパラメータが必要です。

どうすればこの問題を解決できますか?

class SuperClass: 
    def method_X(self): 
     ... 

class A(SuperClass): 
    def method_X(self, a, b): 
     ... 

class B(SuperClass): 
    def method_X(self, a, b, c): 
     ... 
+1

あなたはこれに取り組むために、[デフォルト引数](http://docs.python-guide.org/en/latest/writing/gotchas/)を使用することができます。 – lmiguelvargasf

+7

要するに:しないでください。あなたのサブクラスは、スーパークラスによって設定された契約を破っています。 –

+0

あなたのコードはそれ自体で壊れていません(サブクラスがオーバーライドするメソッドのインターフェースを変更してはならないと言われていますので、それはちょっとお勧めできません)。どのようにコードを使用する予定ですか? – jdehesa

答えて

3

達成しようとしているのは、明確な違反のLiskov Substitution Principleです。さらに、同じ名前のメソッドに対して一貫性のないインターフェースを定義することは面倒であり、ダックタイピングを厳しく制限します。それでもやってみたいのであれば、名前付きのパラメータの代わりにkwargsを使って目的を達成すると思います。

class SuperClass: 
    def method_x(self, **kwargs): 
     ... 

class A(SuperClass): 
    def method_x(self, **kwargs): 
     if 'a' in kwargs: 
      # Do something