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?
3 Réponses :
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)
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 ()
.
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)
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
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
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: LaisserMinimumBalanceAccount
accepter les mêmes arguments queBankAccount
et les lui transmettre; laissezMinimumBalanceAccount
n'accepter aucun argument mais fournissez ses propres arguments par défaut lors de l'appel deBankAccount .__ init__
, laissezMinimumBalanceAccount
ne pas appelerBankAccount .__ init __ code> 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.