python---面向对象(三)类的继承与方法重写
1. 类的继承
1. 继承
一个类继承另一个类时,将自动获得另一个类的所有公有属性和方法。原有的类称为父类,而新类称为子类。子类继承了父类的所有公有属性和方法,同时还可以定义自己的属性和方法。
class Animal(object): age = 5 def __init__(self, name): self.name = name #实例属性 def eat(self, food): print(f'{self.name} is eating {food}') def play(self): print(f'{self.name} is playing') def sleep(self): print(f'{self.name} is sleeping') class Dog(Animal): #继承父类Animal def bark(self): #定义自己的类方法 print(f'{self.name} is barking') #继承父类实例属性 class Pig(Animal): #继承父类Animal def buu(self): print(f'{self.nane} is buuing') dog = Dog('Teddy') #实例化Dog类 print(dog.age) #继承父类类属性age---5 dog.eat('meat') #继承父类Animal,eat 方法 dog.bark() #通过对象dog,调用自己的方法 pig = Pig('Paige') #实例化Pig类 pig.play() #继承父类Animal,play 方法 print(pig.age) #继承父类类属性age----5 """ 5 Teddy is eating meat Teddy is barking Paige is playing 5 """
调用父类__init__()初始化方法
当子类中实现了 __init__ 方法,基类的初始化方法并不会被调用 def __init__(self, ...), 这个时候我们就需要用super()方法调用父类__init__初始化方法。
class Animal(object): def __init__(self, name): self.name = name #实例属性 def eat(self): print(f'{self.name} is eating') class Dog(Animal): #继承父类Animal def __init__(self,name, gender): super().__init__(name) #使用super调用父类__init__()初始化方法 self.gender = gender def show_info(self): print(f'{self.name} is {self.gender}') def bark(self): #定义自己的类方法 print(f'{self.name} is barking') #继承父类实例属性 dog = Dog('Teddy', 'male') #实例化Dog类 dog.show_info() #通过对象dog,调用自己的show_info方法 dog.eat() #继承父类 eat方法 """ Teddy is male Teddy is eating """
2. 多继承
在Python中,当子类继承多个父类时,如果在多个父类中有相同的 成员方法或成员变量,则子类优先继承左边父类中的成员方法或成员变 量,从左到右继承级别从高到低。
class Horse: def __init__(self, name): self.name = name def run(self): #相同的run方法 print('Horse is running') class Donkey: def __init__(self, name): self.name = name def run(self): #相同的run方法 print('Donkey is running') def roll(self): print('Donkey is running') class Mule(Horse, Donkey): def eat(self): print('Mule is eating') mule = Mule('MMM') #实例化对象 mule.run() #继承父类Horse的run 方法 mule.roll() #继承父类Donkey的roll 方法 mule.eat() #通过对象mule调用自己定义的方法eat """ Horse is running Donkey is running Mule is eating """
2. 方法的重写
如果子类的方法名与父类的方法名相同,则在这种情况下,子类的 方法会重写(Override)父类的同名方法。
class Animal(object): age = 5 def __init__(self, name): self.name = name #实例属性 def eat(self): print(f'{self.name} is eating') def play(self): print(f'{self.name} is playing') def sleep(self): print(f'{self.name} is sleeping') class Dog(Animal): #继承父类Animal def eat(self): #重新定义eat方 print(f'{self.name} is eating meat') def bark(self): #定义自己的类方法 print(f'{self.name} is barking') #继承父类实例属性 dog = Dog('Teddy') #实例化Dog类 print(dog.age) #继承父类类属性age---5 dog.eat() #通过对象dog,调用自己的eat方法 dog.bark() #通过对象dog,调用自己的bark方法 """ 5 Teddy is eating meat Teddy is barking """