6

メソッドのデフォルト引数は明らかにオーバーライドできます:

>>> class B:
...     def meth(self, r=True): print r
>>> class D(B):
...     def meth(self, r=False): print r
... D().meth()
False
>>> B().meth()
True

これはどのように可能ですか?それは悪いスタイルと見なされますか?

4

3 に答える 3

12

オーバーライドされたメソッドのシグネチャは、任意の方法で変更できます。Python は気にしません:

class Base:
    def foo(self, x, y):
        pass

class Deriv(Base):
    def foo(self, blah=100):
        pass

しかし、あなたが尋ねるなら

それは悪いスタイルと見なされますか?

重要なリスコフの置換原則に違反しているため、答えは「はい」です。

Deriv が Base を拡張する場合、プログラムを中断することなく、Base のすべての出現箇所を Deriv に置き換えることができなければなりません。

つまり、派生クラスは、基本クラスによって提供されるすべての契約を満たす必要があります。特に、オーバーライドされたメソッドは、同じシグネチャと同様のセマンティクスを持つ必要があります。Python はその点で役に立たないため、IDE (ここでは Intellij IDEA) を使用して手動で制御する必要があります。

ここに画像の説明を入力

デフォルトのパラメーターのオーバーライドに関する特定の質問に答えるには、答えは「場合による」と思います。param が内部的にのみ使用され、オブジェクトの観察可能な動作に影響を与えないオプションである場合、それを変更しても問題はありません。

class Buffer:
    def __init__(self, init_size=16):

class BigBuffer(Buffer):
    def __init__(self, init_size=1024):

一方、パラメータがセマンティクスに実質的に影響する場合、それはコントラクトの一部であり、オーバーライドすべきではありません。たとえば、このコードは紛らわしいでしょう

class Test:
    def test_equal(self, a, b, fail_if_equal=False):

class MyTest(Test):
    def test_equal(self, a, b, fail_if_equal=True):
于 2014-11-22T14:23:41.503 に答える
0

これはどのように可能ですか?
メカニズムは何ですか?

派生クラスでメソッド全体を上書きするだけです。

于 2014-11-22T14:12:36.440 に答える