2016-08-17 6 views
1

, поэтому я пытаюсь понять, как создавать дочерние классы в python.Понимание наследования с классами python

Так ив создал perent и класс ребенка, но я просто не могу понять, как заставить их работать

так что это мой текущий код

from abc import ABCMeta, abstractmethod 

class Persion(object): 
    __metaclass__ = ABCMeta # sets the metaclass to a abstract base class . that means we never call this class directley insted its used for child classes to inhearrit 
    def __init__(self, name, gender): 
     self.name = name 
     self.gender = gender 

    def talk(self): 
     print("hi my name is " + self.name + " and I am a " + self.gender + ".") 

    @abstractmethod 
    def PersionType(self): 
     """Returns a string of the childs type""" 
     pass 

class Player(Persion): 
    def __int__(self,speed): 
     self.name = name 
     self.gender = gender 
     self.speed = speed 
     self.posX = 0 
     self.posY = 0 

    def moveXY(self, X, Y): 
     self.posX = X 
     self.posY = Y 

    def PersionType(self): 
     return 'Player' 

player=Persion("Ben","m") 
hero = Player(player,30) 
hero.moveXY(20,20) 
print("you are now at ", hero.posX, "," , hero.posY) 
print("your speed is ", hero.speed) 
print("your gender is ", hero.gender) 
hero.talk() 

поэтому конечный результат я хочу, чтобы эти функции работать. , но что-то пошло в строю, чтобы наследовать то, что я хочу узнать.

hero.moveXY(20,20) 
print("you are now at ", hero.posX, "," , hero.posY) 
print("your speed is ", hero.speed) 
print("your gender is ", hero.gender) 
hero.talk() 

им получать ошибки Sutch в

line 36, in <module> 
    print("your speed is ", hero.speed) 
AttributeError: 'Player' object has no attribute 'speed' 

Я делаю это, чтобы помочь мне понять, как inheratince работает в питона.

ответ

2

Есть три основные проблемы с вашим кодом:

  1. Изменить __int__ в __init__. Ваш экземпляр не инициализируется, поэтому вы получаете ошибку no attribute 'speed'.

  2. Ваш подкласс (класс, наследующий, который в этом случае равен Player) должен иметь метод __init__, который принимает все аргументы, которые вы хотите связать с ним. Вы можете передать те, которые используются суперклассом (Persion) для суперкласса __init__. Это означает, что, вероятно, изменение метода __init__ к:

    class Player(Persion): 
        def __init__(self, name, gender, speed): 
         super(Player, self).__init__(name, gender) 
         self.speed = speed 
         self.posX = 0 
         self.posY = 0 
    
  3. Теперь, при создании экземпляров, вам нужно всего лишь создать экземпляр подкласса. Он наследует методы из суперкласса:

    hero = Player('Ben', 'm', 30) 
    

С этими изменениями, эти линии:

print("you are now at ", hero.posX, "," , hero.posY) 
print("your speed is ", hero.speed) 
print("your gender is ", hero.gender) 
hero.talk() 

Теперь производят этот вывод:

you are now at 20 , 20 
your speed is 30 
your gender is m 
hi my name is Ben and I am a m. 

Дополнительные небольшие заметки :

  • Возможно, вам захочется присвоить класс Person вместо Persion.
  • Метод @abstractmethod не требуется.
+0

Благодарю вас, вы так хорошо объяснили. Я не понимал, что это было нечто простое, как орфографическая ошибка. Так что он делает сеанс, но я до сих пор не совсем понимаю, что линия super (Player, self) .__ init __ (имя, пол) Я получаю приблизительную идею о том, что она делает. устанавливая значения из класса supper/parent, но я не понимаю, что делает функция super(). – skyzzle

Смежные вопросы