72

この質問にはすでに答えがあります。

私はPythonクラスを持っているなら:

class BaseClass(object):
#code and the init function of the base class

それから、次のような子クラスを定義します。

class ChildClass(BaseClass):
#here I want to call the init function of the base class

基本クラスのinit関数が、子クラスのinit関数の引数として使用している引数をいくつか取る場合、これらの引数を基本クラスに渡すにはどうすればよいですか。

私が書いたコードは次のとおりです。

class Car(object):
    condition = "new"

    def __init__(self, model, color, mpg):
        self.model = model
        self.color = color
        self.mpg   = mpg

class ElectricCar(Car):
    def __init__(self, battery_type, model, color, mpg):
        self.battery_type=battery_type
        super(ElectricCar, self).__init__(model, color, mpg)

どこが悪いの?


  • あなたのフォーマットは間違っています、それはコピー&ペーストの問題ですか? Pythonは間違ったフォーマットで吠えます。 - Mingyu
  • @Mingyuの形式は間違っていますか?あなたは刻み目を意味するか、または私はここで何か他のものを逃していますか? - Prakhar Mohan Srivastava
  • そう..私は刻み目を意味します。下の私の答えを見てください。 - Mingyu

4 답변


86

あなたが使用することができますsuper(ChildClass, self).__init__()

class BaseClass(object):
    def __init__(self, *args, **kwargs):
        pass

class ChildClass(BaseClass):
    def __init__(self, *args, **kwargs):
        super(ChildClass, self).__init__(*args, **kwargs)

あなたのインデントは正しくありません、これが修正されたコードです:

class Car(object):
    condition = "new"

    def __init__(self, model, color, mpg):
        self.model = model
        self.color = color
        self.mpg   = mpg

class ElectricCar(Car):
    def __init__(self, battery_type, model, color, mpg):
        self.battery_type=battery_type
        super(ElectricCar, self).__init__(model, color, mpg)

car = ElectricCar('battery', 'ford', 'golden', 10)
print car.__dict__

これが出力です。

{'color': 'golden', 'mpg': 10, 'model': 'ford', 'battery_type': 'battery'}


  • あなたが合格した場合BaseClasssuper、スキップしますBaseClassそして電話object.__init__これはほとんど間違いなくあなたが望むものではありません。 - abarnert
  • その一方で、OPのコードに問題がある唯一のものは、彼のインデントです。super(たとえあなたがそれを正しく説明したとしても、あなたがしなかったとしても)特に彼がすでにそれを全く同じように使っているならば、助けにはならない。実際、これは文字ごとに同一です。 - abarnert
  • ありがとう、@ abarnert。当初、彼は自分のコードを投稿しておらず、彼が尋ねた質問はタイトルの中のものです。 - Mingyu

23

Mingyuが指摘したように、フォーマットに問題があります。それ以外は、強くお勧めします派生クラスの名前を使用しない通話中super()それはあなたのコードを柔軟にしないからです(コードのメンテナンスと継承の問題)。 Python 3では、使用super().__init__代わりに。これらの変更を組み込んだ後のコードは次のとおりです。

class Car(object):
    condition = "new"

    def __init__(self, model, color, mpg):
        self.model = model
        self.color = color
        self.mpg   = mpg

class ElectricCar(Car):

    def __init__(self, battery_type, model, color, mpg):
        self.battery_type=battery_type
        super().__init__(model, color, mpg)

使用中の問題を指摘してくれたErwin Mayerに感謝します。__class__super()を使って


  • 派生クラスの名前を使用しないようにするための推奨事項について何か説明をいただけますか。 - jwg
  • @jwgその理由を説明するために答えを更新しましたクラスより良い選択です。 - Craig Finch
  • @CraigFinch self .__ class__を使用することは、まったくお勧めできないようです。 Python 3では、単にsuper().__ init__を使うことができます。 - Erwin Mayer
  • Py3はPy2よりも優れています。 (3.4の後にpythonに来た人として) - Marc

9

あなたはこのようにスーパークラスのコンストラクタを呼ぶことができます

class A(object):
    def __init__(self, number):
        print "parent", number

class B(A):
    def __init__(self):
        super(B, self).__init__(5)

b = B()

注意:

これは、親クラスが継承した場合にのみ機能します。object


7

Python 3を使用している場合は、引数を指定せずに単にsuper()を呼び出すことをお勧めします。

class Car(object):
    condition = "new"

    def __init__(self, model, color, mpg):
        self.model = model
        self.color = color
        self.mpg   = mpg

class ElectricCar(Car):
    def __init__(self, battery_type, model, color, mpg):
        self.battery_type=battery_type
        super().__init__(model, color, mpg)

car = ElectricCar('battery', 'ford', 'golden', 10)
print car.__dict__

スーパーで電話しないでくださいクラスそれは無限の再帰例外を引き起こすかもしれないのでこの答え

リンクされた質問


関連する質問

最近の質問