2017-09-27 2 views
0

J'utilise python 2.7 et j'ai créé une classe parent et une classe enfant Cat; J'ai "cassé" la classe Cat en deux parties, et ces deux parties sont censées être liées en une seule, mais sont en train de lancer une erreur:Comment résoudre __init __() en prenant 1 argument quand 2 sont donnés parmi des classes enfants?

Toutes les idées sur la façon de résoudre cela, et quant à la logique de ce passage d'arguments ici ?:

class Dog(object): 
    def __init__(self, name): 
     self.name = name 
     self.age = 6 
    def age_update(self, age_update): 
     self.age+=age_update 
     print("new age: " + str(self.age)) 
    def speak (self): 
     print("My name is "+ self.name + "and I'm "+ str(self.age)) 

class Cat(Dog): 
    def __init__(self): 
     super(Cat, self).__init__(name) 
     self.lives=CatNature() 

class CatNature(Cat): 
    def __init__(self, lives=9): 
     self.lives=lives 

    def show_lives(self): 
     print("This cat has " + str(self.lives) + " lives") 


cat1 = Cat("Fuzz") 
print ("Cat's name is " + cat1.name + " and " + str(cat1.age)) 

cat1.lives.show_lives() 

l'erreur:

Traceback (most recent call last): 
    File "/Users/.../Python_experiments/class.py", line 27, in <module> 
    cat1 = Cat("Fuzz") 
TypeError: __init__() takes exactly 1 argument (2 given) 
+2

Un chat est un chien? –

+0

;-) Oui, j'ai hâte de nommer les classes. Dans l'intérêt de cette expérience, je pensais que les chats et les chiens pouvaient partager les qualités d'avoir un nom et un âge ... et étaient trop distraits par l'erreur pour revenir à ce problème - j'étudierai votre solution - et répondrons avec d'autres questions - merci! – mac

Répondre

4

d'abord, je trouve un peu bizarre que vous sous-classe un Dog dans un Cat, mais cela étant dit, la méthode __init__ de Cat manque le paramètre name:

class Cat(Dog): 
    def __init__(self, name): 
     super(Cat, self).__init__(name) 
     self.lives=CatNature()

Ceci est important car vous passez name à la __init__ de la superclasse.

En outre, il est étrange que CatNature sous-classes de Cat car ce n'est pas un animal, et vous n'appelez pas la fonction super __init__. De toute façon, vous ne pouvez pas appeler la méthode de la classe parente, sinon vous resteriez coincé dans la récursion infinie: chaque CatNature construit un nouveau CatNature, et cela continuera jusqu'à ce que nous ayons un débordement de pile ou que la mémoire soit épuisée.

Une meilleure modélisation est probablement:

class Animal(object): 
    def __init__(self, name): 
     self.name = name 
     self.age = 6 
    def age_update(self, age_update): 
     self.age+=age_update 
     print("new age: " + str(self.age)) 
    def speak (self): 
     print("My name is "+ self.name + "and I'm "+ str(self.age)) 

class Cat(Animal): 
    def __init__(self, name): 
     super(Cat, self).__init__(name) 
     self.lives=CatNature() 

class CatNature(object): 
    def __init__(self, lives=9): 
     self.lives=lives 

    def show_lives(self): 
     print("This cat has " + str(self.lives) + " lives")
+1

Aime le code enhardi :-) +1 –

+0

@ChristianDean: merci pour ce genre de commentaire :) –