079、类的继承

继承是对已有的类进行扩展创建出新的类,这个过程就叫做继承。其中,提供继承信息的类叫做父类(超类、基类),得到继承信息的类称为子类(派生类)。

基本语法

继承是通过在类定义语句中使用圆括号来指定父类(或基类)来实现的。

如:

class Person:  
    def __init__(self, name, age):  
        self.name = name  
        self.age = age  
  
    def introduce(self):  
        print(f"Hello, my name is {self.name} and I am {self.age} years old.")  
  
class Student(Person):  
    def __init__(self, name, age, student_id):  
        # 调用父类的__init__方法  
        super().__init__(name, age)  
        # 添加子类特有的属性  
        self.student_id = student_id  
  
    def show_student_info(self):  
        print(f"Student Information:")  
        print(f"Name: {self.name}")  
        print(f"Age: {self.age}")  
        print(f"Student ID: {self.student_id}") 
        

如上,定义了简单的Person类,该类有两个基本属性:name(名字)和age(年龄),并且有一个introduce方法用于介绍自己。Student类使用圆括号来指定继承自Person类,并添加了一个额外的属性student_id(学生ID)和一个方法show_student_info用于显示学生的详细信息。

继承的特点

  1. 单继承与多继承:Python支持单继承和多继承。在定义类时,如果基类只有一个,则为单继承;如果基类有多个,则为多继承。多继承的语法是在类定义时,将多个基类放在圆括号中,用逗号分隔。如:

    class Vehicle:  
        """交通工具"""
        def __init__(self, make, model):  
            self.make = make  
            self.model = model  
      
        def start_engine(self):  
            print(f"Starting the engine of the {self.make} {self.model}...")  
      
    class ElectronicDevice:  
        """电子设备"""
        def __init__(self, battery_life):  
            self.battery_life = battery_life  
      
        def check_battery(self):  
            print(f"Battery life is {self.battery_life}%.")  
      
    # Car类同时继承自Vehicle和ElectronicDevice  
    class Car(Vehicle, ElectronicDevice):
        """汽车"""
        def __init__(self, make, model, battery_life):  
            # 调用Vehicle的__init__  
            Vehicle.__init__(self, make, model)  
            # 调用ElectronicDevice的__init__  
            ElectronicDevice.__init__(self, battery_life)  
    

    在实际编程中,如果不是必须使用多重继承,就尽量使用单一继承,假如非要使用多重继承,也要尽量避免出现菱形继承(如一个类继承两个父类,但是这两个父类又继承同一个父类),否则代码可读性和可理解性将变得非常糟糕。

  2. 方法重写(Override):子类可以定义与父类同名的方法,这种方法被称为方法重写。当子类对象调用这个方法时,会执行子类定义的方法,而不是父类中的方法。如:

    # 定义父类Animal  
    class Animal:  
        def __init__(self, name):  
            self.name = name  
      
        # 父类中的speak方法  
        def speak(self):  
            print(f"{self.name} makes a sound.")  
      
    # 定义子类Dog,继承自Animal  
    class Dog(Animal):  
        # 重写父类中的speak方法  
        def speak(self):        
            print(f"{self.name} says Woof!")  
      
    # 使用
    my_dog = Dog("Buddy")  
    my_dog.speak()  # 输出: Buddy says Woof!
    
  3. super()函数super()函数是用于调用父类(超类)的一个方法。super()在子类的方法中调用父类的方法时非常有用。如在上面重写的方法中,我们可以通过super()来调用父类方法。

    class Dog(Animal):  
        # 重写父类中的speak方法  
        def speak(self):  
            # 调用父类的speak方法
            super().speak()  
            # 重写  
            print(f"{self.name} says Woof!")  
      
    # 使用
    my_dog = Dog("Buddy")  
    my_dog.speak()  # 输出: Buddy makes a sound. Buddy says Woof!
    
  4. 继承的传递性:如果类C继承自类B,类B又继承自类A,那么类C同时继承了类B和类A的属性和方法。这称为继承的传递性。

总结:

继承是一种is-a的关系,如有一个父类:Person,然后3个子类:student、teacher、programmer。它们的关系是:

a student is a person.

a teacher is a person.

a programmer is a person.

子类直接从父类继承公共的属性和行为,再添加自己特有的属性和行为,所以子类一定是比父类更强大的,任何时候都可以使用子类对象去代替父类对象。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不在同一频道上的呆子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值