1
votes

Comment initialiser une classe héritée en Python

J'ai du mal à comprendre comment initialiser une classe héritée en python OOP.

Je ne peux pas comprendre quels arguments doivent être passés lorsque je l'initialise. Voici les classes que j'utilise:

TypeError                                 Traceback (most recent call last)
<ipython-input-9-85e55fb15340> in <module>
----> 1 acc2 = MinimumBalanceAccount('milind', 1000)

TypeError: __init__() takes 1 positional argument but 3 were given

Mais quand j'essaye d'initialiser la classe enfant:

acc2 = MinimumBalanceAccount('Milind', 1000)    # I am not sure what to pass as arguments here

Python me donne cette erreur:

class BankAccount:  #parent class

    def __init__(self, owner, balance):
        self.owner = owner
        self.balance = balance

    def withdrawal(self, withdraw):
        if withdraw > self.balance:
            raise RuntimeError('Sorry, Insufficient Funds!')
        else:
            print('Withdrawal accepted.')
            self.balance -= withdraw
            show_balance = input('See account balance? enter y or n: ')
            if show_balance == 'y':
                print(self.balance)

    def deposit(self, amt):
        self.balance += amt
        print('Deposit Accepted')
        show_balance = input('See account balance? enter y or n: ')
        if show_balance == 'y':
            print(self.balance)


class MinimumBalanceAccount(BankAccount):        #child class

    minimum_balance = 100

    def __init__(self):
        BankAccount.__init__(self)

    def withdrawal(self, withdraw):
        if self.balance - withdraw < self.minimum_balance:
            print('Error, balance cannot go below minimum value: {}'.format(minimum_balance))
        else:
            self.balance -= withdraw

Que dois-je transmettre comme arguments ?? Qu'est-ce qui ne va pas?


2 commentaires

Vous devez également recevoir les arguments dans le constructeur de la classe enfant et le transmettre à la super classe. sans avoir les paramètres dans init pour MinimumBalanceAccount, vous ne pouvez pas le transmettre à init de BankAccount


MinimumBalanceAccount .__ init__ ne prend aucun argument, ce que vous voyez. Vous avez trois choix: Laisser MinimumBalanceAccount accepter les mêmes arguments que BankAccount et les lui transmettre; laissez MinimumBalanceAccount n'accepter aucun argument mais fournissez ses propres arguments par défaut lors de l'appel de BankAccount .__ init__ , laissez MinimumBalanceAccount ne pas appeler BankAccount .__ init __ du tout. Parmi ceux-ci, vous voulez probablement la première option. Et comme MinimumBalanceAccount .__ init__ ne semble rien faire, vous pouvez l'omettre complètement.


3 Réponses :


1
votes

Vous devez également ajouter les paramètres d'initialisation à votre classe enfant lorsque vous définissez la fonction __init__ et la transmettez au parent.

class MinimumBalanceAccount(BankAccount):        #child class

    minimum_balance = 100

    def __init__(self, owner, balance):
        BankAccount.__init__(self, owner, balance)


1 commentaires

Il convient de noter que __init__ ici peut être entièrement omis, car il ne fait rien. Si vous le gardez, vous devez utiliser super () .



2
votes

Vous devez passer les arguments requis à la sous-classe, et à la superclasse:

class MinimumBalanceAccount(BankAccount):        #child class

    minimum_balance = 100

    def withdrawal(self, withdraw):
        if self.balance - withdraw < self.minimum_balance:
            print('Error, balance cannot go below minimum value: {}'.format(minimum_balance))
        else:
            self.balance -= withdraw

Dans ce cas, comme indiqué par @Deceze dans les commentaires, vous pouvez omettre __init__ entièrement:

class BankAccount:

    def __init__(self, owner, balance):
        self.owner = owner
        self.balance = balance

    def withdrawal(self, withdraw):
        if withdraw > self.balance:
            raise RuntimeError('Sorry, Insufficient Funds!')
        else:
            print('Withdrawal accepted.')
            self.balance -= withdraw
            show_balance = input('See account balance? enter y or n: ')
            if show_balance == 'y':
                print(self.balance)

    def deposit(self, amt):
        self.balance += amt
        print('Deposit Accepted')
        show_balance = input('See account balance? enter y or n: ')
        if show_balance == 'y':
            print(self.balance)


class MinimumBalanceAccount(BankAccount):

    minimum_balance = 100

    def __init__(self, owner, balance):
        super().__init__(owner, balance)
        self.minimum_balance = MinimumBalanceAccount.minimum_balance

    def withdrawal(self, withdraw):
        if self.balance - withdraw < self.minimum_balance:
            print('Error, balance cannot go below minimum value: {}'.format(minimum_balance))
        else:
            self.balance -= withdraw

acc2 = MinimumBalanceAccount('Milind', 1000)


2 commentaires

Ou vous devez omettre complètement MinimumBalanceAccount .__ init__


Oui, j'ai remarqué cela, merci; J'ai pensé que ce serait une bonne idée de le garder à titre d'illustration pour l'utilisation de super () ... J'ai ajouté l'affectation de minimum_balance comme variable d'instance afin < code> __ init__ est nécessaire



0
votes

classe MinimumBalanceAccount (BankAccount): #child class

minimum_balance = 100

def __init__(self,owner, balance):
    BankAccount.__init__(self,owner,balance)

def withdrawal(self, withdraw):
    if self.balance - withdraw < self.minimum_balance:
        print('Error, balance cannot go below minimum value: {}'.format(minimum_balance))
    else:
        self.balance -= withdraw


0 commentaires