web-dev-qa-db-ja.com

サブクラスでスーパークラスコンストラクターを呼び出すことは本当に重要ですか?

次のPythonコードの部分は、スーパークラスを、1つまたは複数のサブクラスが使用する関数のリポジトリとしてのみ使用します。

class Class(object):
    ''' A trivial repository for functions to be inherited '''

    def function(self):
        print self

class Subclass(Class):
    ''' A subclass where the action is'''

    def __init__(self):
        pass

subitem = Subclass()
subitem.function()

これは、その目的に合った最小限のコーディングのようです。

ただし、同じことをコーディングするためのより良い方法は、スーパークラスにコンストラクターを用意し、サブクラスコンストラクター内で呼び出すことだと主張されたが、一種のより緊密なカップリングであるとの指摘はない。

class Class(object):
    ''' The function repository, now featuring a constructor'''

    def __init__(self):
        pass

    def function(self):
        print self


class Subclass(Class):
    ''' The same subclass, but its constructor invokes the superclass constructor'''

    def __init__(self):
        Class.__init__(self)

subitem = Subclass()
subitem.function()

問題は...サブクラス化の2番目の方法が最初の方法より「優れている」とはどのようなものでしょうか。優れているとは、より一般的で、さまざまな状況に適用できることなどを意味します。

一緒に考えてくれてありがとう。

5
XavierStuvw

selfのコンストラクターでClassに変数を追加し、SubclassのコンストラクターでClass.__init__()を呼び出さない場合、これらの変数はSubclassオブジェクト内。

例については その質問 を参照してください。

あなたの場合、Classは単なる関数リポジトリです。したがって、違いはありません。ただし、将来的には、そのクラスの関数が連携して動作するように変数を追加する必要があるかもしれません。そのためには、selfを使用すると便利です。

selfを後で使用する場合は、ここでClass.__init__()を追加すると、時間を節約できる場合があります。実際、Subclassコンストラクターでその行を忘れたことを理解するには、長い時間がかかる場合があります。

14
DRz