引子
Why:面向对象更符合人类对客观世界的抽象和理解
一切皆对象
一只小狗,一把椅子,一张信用卡,一条巧克力。。。
一切对象,都有自己内在的属性
狗狗的品种、椅子的质地、信用卡的额度、巧克力的口味。。。
一切行为,皆是对象的行为
狗狗蹲下、椅子移动位置、刷信用卡、巧克力融化了。。。
How:类是对象的载体
不同年龄、肤色、品质的猫,每一只都是一个对象
他们有一个共同的特征:都是猫
我们可以把一类对象的公共特征抽象出来,创建通用的类
7.1 类的定义
三要素:类名、属性、方法
7.1.1 类的命名
要有实际意义
驼峰命名法——组成的单词首字母大写
Dog、 CreditCard、 ElectricCar
# class 类名:
"""类前空两行"""
class Car():
"""对该类的简单介绍"""
pass
"""类后空两行"""
7.1.2 类的属性
# def __init__(self,要传递的参数) 初始化类的属性
7.1.3 类的方法
相对于类内部定义的函数
7.2 创建实例
7.2.1 实例的创建
将实例赋值给对象,实例化过程中,传入相应的参数
v = 类名(必要的初始化参数)
7.2.2 访问属性
实例名.属性名
7.2.3 调用方法
实例名.方法名(必要的参数)
7.2.4 修改属性
1、直接修改
先访问,后修改
2、通过方法修改属性
3、继续拓展
禁止设置负里程
小结
包含的信息量可以是极大的,可以创建无穷多的实例
高度的拟人(物)化,符合人类对客观世界的抽象和理解
7.3 类的继承
引子
看一下人在生物界的分支链
生物——动物界——脊索动物门——哺乳动物纲——灵长目——人科——人属——智人种
公共特征逐渐增加的过程
【问题】
假设二元系统: 人属 = {A人种, B人种, C人种。。。。}
为每一个人种构造一个类
方案一: 各自独立,分别构造各自人种的类
方案二:
1、将各人种公共特征提取出来,建立人属的类;
2、各人种继承上一级(人属)的公共特征,然后添加自身特殊特征,构建各自人种的类。
通常,我们选择方案二,因为他避免了过多的重复劳动
所谓继承,就是低层抽象继承高层抽象的过程
7.3.1 简单的继承
父类
子类
class 子类名(父类名):
新建一个电动汽车的类
class ElectricCar(Car):
"""模拟电动汽车"""
def __init__(self, brand, model, year):
"""初始化电动汽车属性"""
super().__init__(brand, model, year) # 声明继承父类的属性
自动继承父类的所有方法
7.3.2 给子类添加属性和方法
7.3.3 重写父类的方法——多态
class ElectricCar(Car):
"""模拟电动汽车"""
def __init__(self, brand, model, year, bettery_size):
"""初始化电动汽车属性"""
super().__init__(brand, model, year) # 声明继承父类的属性
self.bettery_size = bettery_size # 电池容量
self.electric_quantity = bettery_size # 电池剩余电量
self.electric2distance_ratio = 5 # 电量距离换算系数 5公里/kW.h
self.remainder_range = self.electric_quantity*self.electric2distance_ratio # 剩余可行驶里程
def get_main_information(self): # 重写父类方法
"""获取汽车主要信息"""
print("品牌:{} 型号:{} 出厂年份:{} 续航里程:{} 公里"
.format(self.brand, self.model, self.year, self.bettery_size*self.electric2distance_ratio))
def get_electric_quantit(self):
"""查看当前电池电量,重新计算电量可支撑行驶里程"""
print("当前电池剩余电量:{} kW.h".format(self.electric_quantity))
def set_electric_quantity(self, electric_quantity):
"""设置电池剩余电量"""
if electric_quantity >= 0 and electric_quantity <= self.bettery_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))
7.3.4 用在类中的实例
把电池抽象成一个对象
逻辑更加清晰
class Bettery():
"""模拟电动汽车的电池"""
def __init__(self, bettery_size = 70):
self.bettery_size = bettery_size # 电池容量
self.electric_quantity = bettery_size # 电池剩余电量
self.electric2distance_ratio = 5 # 电量距离换算系数 5公里/kW.h
self.remainder_range = self.electric_quantity*self.electric2distance_ratio # 剩余可行驶里程
def get_electric_quantit(self):
"""查看当前电池电量"""
print("当前电池剩余电量:{} kW.h".format(self.electric_quantity))
def set_electric_quantity(self, electric_quantity):
"""设置电池剩余电量,计重新算电量可支撑行驶里程"""
if electric_quantity >= 0 and electric_quantity <= self.bettery_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))