【Python】DS的基础学习笔记6:类——面向对象的编程

本文深入介绍了Python中的面向对象编程,包括类的定义、实例创建、属性和方法的使用,以及类的继承。从实例出发,详细讲解了类的命名规范、属性(如汽车的型号、品牌和里程)以及方法(如获取信息和修改属性)。通过类的继承,展示了如何减少代码重复,实现多态,并通过电池类的实例进一步增强了代码逻辑的清晰度。最后,讨论了类中使用实例作为属性的优势。
摘要由CSDN通过智能技术生成

引子

面向对象更符合人类对客观世界的抽象和理解

  • 一切皆对象
    一只小狗、一把椅子、一张信用卡、一条巧克力…
  • 一切对象,都有其内在属性
    狗狗的品种、椅子的质地、信用卡的额度、巧克力的口感…
  • 一切行为,皆是对象的行为
    狗狗蹲下、椅子移动位置、刷信用卡、巧克力融化…

类是对象的载体
不同年龄、肤色、品质的猫,每一只都是一个对象
它们都有一个共同的特征:都是猫
我们可以把一类对象的公共特征抽象出来,创建通用的类

# 创建类
class Cat():
    """模拟猫"""

    def __init__(self, name):
        """初始化属性"""
        self.name = name

    def jump(self):
        """模拟猫跳跃"""
        print(self.name + " is jumping")


# 用类创建实例
my_cat = Cat("Loser")
your_cat = Cat("Lucky")
# 调用属性
print(my_cat.name)
print(your_cat.name)
# 调用方法
my_cat.jump()
your_cat.jump()

以上实例运行结果为

Loser
Lucky
Loser is jumping
Lucky is jumping

7.1 类的定义

三要素:类的名称、类的属性、类的方法

7.1.1 类的命名

  • 要有实际意义
  • 驼峰命名法——组成的单词首字母大写
  • Dog、 CreditCard、 ElectricCar
# class 类名
"""类前空两行"""


class Car():
    """对该类的简单介绍"""
    pass


"""类后空两行"""

7.1.2 类的属性

# def __init__(self, 要传递的参数)  初始化类的属性
class Car():
    """模拟汽车"""


    def __init__(self, brand, model, year):
        """初始化汽车属性"""   #相当于类内部变量
        self.brand = brand  #汽车的品牌
        self.model = model  #汽车的型号
        self.year = year    #汽车出厂年份
        self.mileage = 0    #汽车总里程初始化为0

7.1.3 类的方法

相对于类内部定义的函数

class Car():
    """模拟汽车"""


    def __init__(self, brand, model, year):
        """初始化汽车属性"""   #相当于类内部变量
        self.brand = brand  #汽车的品牌
        self.model = model  #汽车的型号
        self.year = year    #汽车出厂年份
        self.mileage = 0    #汽车总里程初始化为0

    def get_main_information(self): # self不能省
        """获取汽车主要信息"""
        print("品牌:{} 型号:{} 出厂年份:{}".format(self.brand, self.model, self.year))

    def get_mileage(self):
        """获取总里程数"""
        return "汽车总里程:{}公里".format(self.mileage)

7.2 实例创建

7.2.1 实例的创建

将实例赋值给对象,实例化过程中,传入相应参数
v = 类名(必要的初始化参数)

my_new_car = Car("Audi", "A6", 2018)

7.2.2 访问属性

类名.属性名

print(my_new_car.brand)
print(my_new_car.model)
print(my_new_car.year)

7.2.3 调用方法

实例名.方法名(必要的参数)

my_new_car = Car("Audi", "A6", 2018)
my_new_car.get_main_information()
s = my_new_car.get_mileage()
print(s)

运行结果为:

品牌:Audi 型号:A6 出厂年份:2018
汽车总里程:0公里

7.2.4 修改属性

1. 直接修改

my_old_car = Car("BYD", "宋", 2016)

先访问后修改

print(my_old_car.mileage)
my_old_car.mileage = 12000
print(my_old_car.mileage)

运行结果为:

0
12000

2. 通过方法修改属性

class Car():
    """模拟汽车"""


    def __init__(self, brand, model, year):
        """初始化汽车属性"""   #相当于类内部变量
        self.brand = brand  #汽车的品牌
        self.model = model  #汽车的型号
        self.year = year    #汽车出厂年份
        self.mileage = 0    #汽车总里程初始化为0

    def get_main_information(self): # self不能省
        """获取汽车主要信息"""
        print("品牌:{} 型号:{} 出厂年份:{}".format(self.brand, self.model, self.year))

    def get_mileage(self):
        """获取总里程数"""
        return "汽车总里程:{}公里".format(self.mileage)
    
    def set_mileage(self, distance):
        """设置总里程数"""
        self.mileage = distance
my_old_car.set_mileage(8000)
print(my_old_car.mileage)

运行结果为:

8000

3.继续拓展

  • 禁止设置负里程
    def set_mileage(self, distance):
        """设置总里程数"""
        if distance >= 0:
            self.mileage = distance
        else:
            print("里程数不能为负!")
  • 将每次的里程数叠加
    def increment_mileage(self, distance):
        """总里程数累计"""
        if distance >= 0:
            self.mileage += distance
        else:
            print("新增里程数不能为负")
my_old_car.increment_mileage(800)
print(my_old_car.get_mileage())

小结

  • 包含的信息量可以是极大的,可以创建无穷多的实例
  • 高度的拟人(拟物)化,符合人类对客观世界的抽象和理解

7.3 类的继承

引子

看一下人在生物界的分支链
生物——动物界——脊索动物门——哺乳动物纲——灵长目——人科——人属——智人种
公共特征逐渐增加的过程

【问题】
假设二元系统:人属 = {A人种, B人种, C人种…}
为每一个人种构造一个类

方案一:各自独立,分别构造各自人种的类

方案二
1.将各人种公共特征提取出来,建立人属的类
2.各人种继承上一级(人属)的公共特征,然后添加自身特殊特征,构建各自人种的类

通常,我们选择方案二,因为它避免了过多的重复劳动

*所谓继承,就是底层抽象继承高层抽象的过程

7.3.1 简单的继承

父类

class Car():
    """模拟汽车"""


    def __init__(self, brand, model, year):
        """初始化汽车属性"""   #相当于类内部变量
        self.brand = brand  #汽车的品牌
        self.model = model  #汽车的型号
        self.year = year    #汽车出厂年份
        self.mileage = 0    #汽车总里程初始化为0

    def get_main_information(self): # self不能省
        """获取汽车主要信息"""
        print("品牌:{} 型号:{} 出厂年份:{}".format(self.brand, self.model, self.year))

    def get_mileage(self):
        """获取总里程数"""
        return "汽车总里程:{}公里".format(self.mileage)

    def set_mileage(self, distance):
        """设置总里程数"""
        if distance >= 0:
            self.mileage = distance
        else:
            print("里程数不能为负!")

    def increment_mileage(self, distance):
        """总里程数累计"""
        if distance >= 0:
            self.mileage += distance
        else:
            print("新增里程数不能为负")

子类
class 子类名 (父类名):

  • 新建一个电动汽车的类
class ElectricCar(Car):
    """模拟电动汽车"""
    
    def __init__(self, brand, model, year):
        """初始化电动汽车属性"""
        super().__init__(brand, model, year)    #声明继承父类的属性
  • 自动继承父类所有方法
my_electric_car = ElectricCar("NextWeek", "FF91", 2048)
my_electric_car.get_main_information()

运行结果为:

品牌:NextWeek 型号:FF91 出厂年份:2048

7.3.2 给子类添加属性和方法

class ElectricCar(Car):
    """模拟电动汽车"""

    def __init__(self, brand, model, year, battery_size):
        """初始化电动汽车属性"""
        super().__init__(brand, model, year)    # 声明继承父类的属性
        self.battery_size = battery_size   # 电池容量
        self.electric_quantity = battery_size   # 电池剩余电量
        self.electric2distance_ratio = 5    # 电量距离换算系数 5公里/kW.h
        self.remainder_range = self.electric_quantity*self.electric2distance_ratio  # 剩余可行驶里程

    def get_electric_quantity(self):
        """查看当前电池电量"""
        print("当前电池剩余电量:{}kW.h".format(self.electric_quantity))

    def set_electric_quantity(self, electric_quantity):
        """设置电池剩余电量,重新计算电量可支撑行驶里程"""
        if 0 <= electric_quantity <= self.battery_size:
            self.electric_quantity = electric_quantity
            self.remainder_range = self.electric_quantity*self.electric2distance_ratio
        else:
            print("电量未设置在合理范围!")

    def get_remainder_range(self):
        """查看剩余可行驶里程"""
        print("当前电量还可以继续驾驶{}公里".format(self.remainder_range))
my_electric_car = ElectricCar("NextWeek", "FF91", 2048, 70)
my_electric_car.get_electric_quantity()  # 获取当前电池电量
my_electric_car.set_electric_quantity(50)  # 重设电池电量
my_electric_car.get_electric_quantity()  # 获取当前电池电量
my_electric_car.get_remainder_range()  # 获取当前剩余可行驶里程

运行结果为:

当前电池剩余电量:70kW.h
当前电池剩余电量:50kW.h
当前电量还可以继续驾驶250公里

7.3.3 重写父类的方法——多态

    def get_main_information(self):  # 重写父类方法
        """获取汽车的主要信息"""
        print("品牌:{}  型号:{}  出厂年份:{}  续航里程:{}公里".format(self.brand, self.model, self.year, self.remainder_range))
my_electric_car.get_main_information()

运行结果为:

品牌:NextWeek  型号:FF91  出厂年份:2048  续航里程:250公里

我们可以注意到,电动汽车中的属性大多和电池有关,我们能否单独把电池写成一个类呢?然后我们再将此类作为电动汽车类的一个属性,这样可以使得逻辑更加清晰

7.3.4 用在类中的实例

把电池抽象成一个对象,逻辑更加清晰

class Battery():
    """模拟电动汽车的电池"""

    def __init__(self, battery_size=70):
        self.battery_size = battery_size  # 电池容量
        self.electric_quantity = battery_size  # 电池剩余电量
        self.electric2distance_ratio = 5  # 电量距离换算系数 5公里/kW.h
        self.remainder_range = self.electric_quantity * self.electric2distance_ratio  # 剩余可行驶里程

    def get_electric_quantity(self):
        """查看当前电池电量"""
        print("当前电池剩余电量:{}kW.h".format(self.electric_quantity))

    def set_electric_quantity(self, electric_quantity):
        """设置电池剩余电量,重新计算电量可支撑行驶里程"""
        if 0 <= electric_quantity <= self.battery_size:
            self.electric_quantity = electric_quantity
            self.remainder_range = self.electric_quantity * self.electric2distance_ratio
        else:
            print("电量未设置在合理范围!")

    def get_remainder_range(self):
        """查看剩余可行驶里程"""
        print("当前电量还可以继续驾驶{}公里".format(self.remainder_range))


class ElectricCar(Car):
    """模拟电动汽车"""

    def __init__(self, brand, model, year, battery_size):
        """初始化电动汽车属性"""
        super().__init__(brand, model, year)  # 声明继承父类的属性
        self.battery = Battery(battery_size)  # 电池

    def get_main_information(self):  # 重写父类方法
        """获取汽车的主要信息"""
        print("品牌:{}  型号:{}  出厂年份:{}  续航里程:{}公里".format(self.brand, self.model, self.year, self.battery.remainder_range))
my_electric_car = ElectricCar("NextWeek", "FF91", 2048, 70)
my_electric_car.battery.get_electric_quantity()  # 获取当前电池电量
my_electric_car.battery.set_electric_quantity(50)  # 重设电池电量
my_electric_car.battery.get_electric_quantity()  # 获取当前电池电量
my_electric_car.battery.get_remainder_range()  # 获取当前剩余可行驶里程
my_electric_car.get_main_information()

运行结果为:

当前电池剩余电量:70kW.h
当前电池剩余电量:50kW.h
当前电量还可以继续驾驶250公里
品牌:NextWeek  型号:FF91  出厂年份:2048  续航里程:250公里

以上,便是本节全部内容,对类有了些了解。对第一次了解面向对象思维的同学来说,可能有些绕,通过多多练习,便可熟练运用类来编程。
下一节,我们将学习文件的读写、异常处理以及模块导入。

下节见!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值