web-dev-qa-db-ja.com

子クラスから基本クラスの__init__メソッドを呼び出す方法は?

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)

どこがおかしいの?

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'}
102
Mingyu

Mingyuが指摘したように、フォーマットには問題があります。それ以外は、コードに柔軟性を持たせないため(コードのメンテナンスと継承の問題)、super()を呼び出しているときにDerivedクラスの名前を使用しないを強くお勧めします。 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)

Super()で__class__を使用する際の問題を指摘してくれたErwin Mayerに感謝します。

29
Manjunath Reddy

このようにスーパークラスのコンストラクターを呼び出すことができます

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

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

b = B()

注:

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

10
thefourtheye

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__

(この答え のように無限再帰例外につながる可能性があるため、classでsuperを呼び出さないでください。

8
Erwin Mayer