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
"""
posted @ 2022-01-17 19:07  ElsaWang  阅读(526)  评论(0)    收藏  举报