Hoe kan ik de __init__ methode van Base Class aanroepen vanuit de onderliggende klasse?

Als ik een python-klasse heb als:

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

En dan definieer ik een kindklasse zoals:

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

Als de init-functie van de basisklasse een aantal argumenten aanneemt dat ik ze als argumenten van de init-functie van de onderliggende klasse neem, hoe geef ik deze argumenten dan door aan de basisklasse?

De code die ik heb geschreven is:

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)

Waar ga ik fout?


Antwoord 1, autoriteit 100%

Je zou super(ChildClass, self).__init__()

kunnen gebruiken

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

Uw inspringing is onjuist, hier is de gewijzigde code:

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__

Dit is de uitvoer:

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

Antwoord 2, autoriteit 41%

Zoals Mingyu al aangaf, is er een probleem met het formatteren. Afgezien daarvan raad ik ten zeerste aan om de naam van de afgeleide klasse niet te gebruikentijdens het aanroepen van super(), omdat het je code inflexibel maakt (code-onderhoud en overervingsproblemen). Gebruik in Python 3 in plaats daarvan super().__init__. Hier is de code na het opnemen van deze wijzigingen:

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)

Met dank aan Erwin Mayer voor het wijzen op het probleem bij het gebruik van __class__met super()


Antwoord 3, autoriteit 9%

Als je Python 3 gebruikt, is het aan te raden om super() aan te roepen zonder enig argument:

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__

Bel geen super met class, aangezien dit kan leiden tot oneindige recursie-uitzonderingen volgens dit antwoord.


Antwoord 4, autoriteit 8%

Je kunt de constructor van de superklasse zo aanroepen

class A(object):
    def __init__(self, number):
        print "parent", number
class B(A):
    def __init__(self):
        super(B, self).__init__(5)
b = B()

OPMERKING:

Dit werkt alleen als de bovenliggende klasse object

erft

Other episodes