【笔记】python中的继承:子类的方法 _init_()、给子类定义属性和方法、重写父类的方法、将实例用作属性

本文介绍了Python中的继承概念,包括如何通过子类化创建新类,子类如何调用父类的`__init__()`方法,如何定义子类的专属属性和方法,如何重写父类的方法,以及如何将实例用作其他类的属性。通过具体的代码示例,解释了如何创建电动汽车类ElectricCar作为Car类的子类,以及如何处理电动汽车的电池属性和方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、继承

编写类时,并非总是要从空白开始。如果要编写的类是另一个现成类的特殊版本,可使用继承,一个类继承另一个类时,将自动获得另一个类所有属性方法

原有的类称为父类,而新的类称为子类。子类继承了父类的所有属性方法同时还可以定义自己的属性和方法

1.子类的方法(init())

在既有类的基础上编写新类时,通常要调用父类的方法__init__()。这将初始化在父类__init__()方法中定义的所有属性,从而让子类包含这些属性。

:下面来模拟电动汽车。电动汽车是一种特殊的汽车,因此可在前面创建Car类的基础上创建新类ElectricCar。这样就只需为电动汽车特有的属性和行为编写代码。

class Car:
    """一次模拟汽车的简单尝试、父类"""

    def __init__(self,make,model,year):
        """初始化汽车的属性"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0

    def get_descriptive_name(self):
        """返回简洁的描述性信息"""
        long_name = f"{self.year} {self.make} {self.model}"
        return long_name.title()

    def read_odometer(self):
        """打印一条指出汽车里程的消息"""
        print(f"This car has {self.odometer_reading} miles on it.")

    def update_odometer(self,mileage):
        """将里程表读书设置为指定的值。
            禁止将里程表读数往回调
        """
        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")

    def increment_odometer(self,miles):
        """将里程表读数增加指定的量。"""
        self.odometer_reading  += miles

class ElectricCar(Car): #指定父类名称
    """电动汽车的独特之处"""

    def __init__(self,make,model,year):
        """初始化父类的属性。"""
        super().__init__(make,model,year)

my_tesla = ElectricCar('tesla','model s',2019)
print(my_tesla.get_descriptive_name())

输出结果
在这里插入图片描述
代码解析
1.创建子类代码时,父类必须包含在当前文件中,且位于子类前面。

2.定义子类时,必须在圆括号内指定父类的名称。方法__init__()接受创建Car实例所需要的信息。

3.super()是一个特殊函数,让我们能够调用父类的方法。父类也成为超类(superclass),名称super由此而来。

2.给子类定义属性和方法

让一个类继承另一个类后,就可以添加区分子类和父类所需的新属性和新方法了。

例:添加一个电动汽车特有的属性(电瓶),以及一个描述该属性的方法。我们将存储电瓶容量,并编写一个打印电瓶描述的方法

class Car:
    """一次模拟汽车的简单尝试、父类"""

    def __init__(self,make,model,year):
        """初始化汽车的属性"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0

    def get_descriptive_name(self):
        """返回简洁的描述性信息"""
        long_name = f"{self.year} {self.make} {self.model}"
        return long_name.title()

    def read_odometer(self):
        """打印一条指出汽车里程的消息"""
        print(f"This car has {self.odometer_reading} miles on it.")

    def update_odometer(self,mileage):
        """将里程表读书设置为指定的值。
            禁止将里程表读数往回调
        """
        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")

    def increment_odometer(self,miles):
        """将里程表读数增加指定的量。"""
        self.odometer_reading  += miles

class ElectricCar(Car):
    """电动汽车的独特之处"""

    def __init__(self,make,model,year):
        """
            初始化父类的属性。
            再初始化电瓶车特有的属性
        """
        super().__init__(make,model,year)
        self.battery_size = 75
    def describe_battery(self):
        """打印一条描述电瓶容量的信息。"""
        print(f"This car has a {self.battery_size}-KWh battery.")

my_tesla = ElectricCar('tesla','model s',2019)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()

输出结果
在这里插入图片描述
代码分析:

我们添加了新属性self.battery_size,并设计其初始值(75).根据ElectricCar类创建的所有实例都将包含该属性,但所有Car实例不包含它

3.重写父类的方法

对于父类的方法,只要他不符合子类模拟的实物的行为,都可以进行重写

为此,可在子类中定义一个与要重写的父类方法同名的方法。这样,python将不会考虑这个父类方法,而只关注我们在子类中定义的相应方法

:假设Car类有一个名为fill_gas_tamk()的方法,它对全电动汽车来说毫无意义,因此我们需要重写它。

class Car:
    """一次模拟汽车的简单尝试、父类"""

    def __init__(self,make,model,year):
        """初始化汽车的属性"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0

    def get_descriptive_name(self):
        """返回简洁的描述性信息"""
        long_name = f"{self.year} {self.make} {self.model}"
        return long_name.title()

    def read_odometer(self):
        """打印一条指出汽车里程的消息"""
        print(f"This car has {self.odometer_reading} miles on it.")

    def update_odometer(self,mileage):
        """将里程表读书设置为指定的值。
            禁止将里程表读数往回调
        """
        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")

    def increment_odometer(self,miles):
        """将里程表读数增加指定的量。"""
        self.odometer_reading  += miles

    def fill_gas_tank(self):
        """汽车的油箱情况"""
        print("The cars need gas tank!")

class ElectricCar(Car):
    """电动汽车的独特之处"""

    def __init__(self,make,model,year):
        """
            初始化父类的属性。
            再初始化电瓶车特有的属性
        """
        super().__init__(make,model,year)
        self.battery_size = 75

    def describe_battery(self):
        """打印一条描述电瓶容量的信息。"""
        print(f"This car has a {self.battery_size}-KWh battery.")

    def fill_gas_tank(self):
        """电动汽车没有油箱"""
        print("This eletriccar doesn't need a gas tank!")

my_tesla = ElectricCar('tesla','model s',2019)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
my_tesla.fill_gas_tank()

输出结果
在这里插入图片描述

4.将实例用作属性

使用代码模拟实物时,我们可能会发现自己给类添加的细节越来越多:属性和方法清单以及文件都越来越长。在这种情况下,可能需要将类的一部分提取出来,作为一个独立的类。可以将大型类拆分成多个协同工作的小类。

:我们在不断给ElectricCar类添加细节时,可能会发现其中包含很多专门针对汽车电瓶的属性和方法。在这种情况下,可将这些属性和方法提取出来,放到一个名为Battery的类中,并将一个Battery实例作为ElectricCar类的属性

class Car:
    """一次模拟汽车的简单尝试、父类"""

    def __init__(self,make,model,year):
        """初始化汽车的属性"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0

    def get_descriptive_name(self):
        """返回简洁的描述性信息"""
        long_name = f"{self.year} {self.make} {self.model}"
        return long_name.title()

    def read_odometer(self):
        """打印一条指出汽车里程的消息"""
        print(f"This car has {self.odometer_reading} miles on it.")

    def update_odometer(self,mileage):
        """将里程表读书设置为指定的值。
            禁止将里程表读数往回调
        """
        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")

    def increment_odometer(self,miles):
        """将里程表读数增加指定的量。"""
        self.odometer_reading  += miles

class Battery:
    """一次模拟电动汽车电瓶的简单尝试"""
    def __init__(self,battery_size=75):
        """初始化电瓶的属性。"""
        self.battery_size = battery_size

    def describe_battery(self):
        """打印一条描述电瓶容量的信息。"""
        print(f" This car has a {self.battery_size}-kwh battery.")

class ElectricCar(Car):
    """电动汽车的独特之处"""

    def __init__(self,make,model,year):
        """
            初始化父类的属性。
            再初始化电瓶车特有的属性
        """
        super().__init__(make,model,year)
        self.battery = Battery() #将一个Battery实例作为ElectricCar类的属性

my_tesla = ElectricCar('tesla','model s',2019)

print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()

输出结果:
在这里插入图片描述
代码分析:

1.这段代码中定义了一个名为Battery的新类,他没有继承任何类

2.Battery类中的方法_init_()除self外,还有另一个形参battery_size

3.我们创建一辆电动汽车,并将其赋给变量my_tesla。描述电瓶时,需要使用电动汽车的属性battery:

my_tesla.battery.describe_battery()

这行代码让python在实例my_tesla中查找属性battery,并对存储在该属性中的battery实例调用方法describe_battery()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

菜菜努力码

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

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

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

打赏作者

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

抵扣说明:

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

余额充值