Python入门——类,面向对象的编程

引子

  • Why:面向对象更符合人类对客观世界的抽象和理解
    • 一切皆对象
      一只小狗,一把椅子,一张信用卡,一条巧克力。。。
    • 一切对象,都有自己内在的属性
      狗狗的品种、椅子的质地、信用卡的额度、巧克力的口味。。。
    • 一切行为,皆是对象的行为
      狗狗蹲下、椅子移动位置、刷信用卡、巧克力融化了。。。
  • How:类是对象的载体
    • 不同年龄、肤色、品质的猫,每一只都是一个对象
      他们有一个共同的特征:都是猫
      我们可以把一类对象的公共特征抽象出来,创建通用的类
# 创建类
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

第一部分 类的定义

  • 三要素:类名、属性、方法

1.1 类的命名

  • 要有实际意义
  • 驼峰命名法——组成的单词首字母大写
    Dog、 CreditCard、 ElectricCar
  • 类定义的前后空两行
  • 紧跟类定义后面要写注释
  • 类的内部函数定义前后空一行(外部函数定义前后空两行)
"""类前空两行"""
​
​
class Car():
    """对该类的简单介绍"""

    def __init__(self):
        pass
                                #空一行
    def fun(self):
        pass

    pass"""类后空两行"""

1.2 类的属性——类内部声明的变量

def __init__(self,要传递的参数):  
    """初始化类的属性,self不要忘记写"""
    pass
class Car():
    """模拟汽车"""
    
    def __init__(self, brand, model, year):
        """初始化汽车属性"""         
        self.brand = brand                 # 汽车的品牌
        self.model = model                 # 汽车的型号
        self.year = year                   # 汽车出厂年份
        self.mileage = 0                   # 可以直接赋值,新车总里程初始化为0        

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)

第二部分 创建实例

2.1 实例的创建——实例名 = 类名(初始化参数)

  • 将实例赋值给对象,实例化过程中,传入相应的参数
my_new_car = Car("Audi", "A6", 2018)

2.2 访问属性——实例名.属性名

print(my_new_car.brand)
print(my_new_car.model)
print(my_new_car.year)
Audi
A6
2018

2.3 调用方法——实例名.方法名(参数)

my_new_car.get_main_information()
mileage = my_new_car.get_mileage()
print(mileage)
品牌:Audi   型号:A6   出厂年份:2018
行车总里程:0公里

2.4 修改属性

2.4.1 直接修改

my_old_car = Car("BYD", "宋", 2016)
print(my_old_car.mileage)

my_old_car.mileage = 12000
print(my_old_car.mileage)

print(my_old_car.get_mileage())
0
12000
行车总里程:12000公里

2.4.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 = Car("BYD", "宋", 2016)
print(my_old_car.get_mileage())
my_old_car.set_mileage(8000)
print(my_old_car.get_mileage())
行车总里程:0公里
行车总里程:8000公里

2.4.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):
        """获取总里程数"""
        print("行车总里程:{}公里".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("新增里程数不能为负!") 
            

my_old_car = Car("BYD", "宋", 2016)
my_old_car.get_mileage()
my_old_car.set_mileage(-8000)
my_old_car.get_mileage()
行车总里程:0公里
里程数不能为负!
行车总里程:0公里
  • 将每次的里程数累加
my_old_car.get_mileage()
my_old_car.set_mileage(8000)
my_old_car.get_mileage()
my_old_car.increment_mileage(500)
my_old_car.get_mileage()
行车总里程:0公里
行车总里程:8000公里
行车总里程:8500公里

2.5 小结

my_new_car = Car("Audi", "A6", 2018)
my_cars = [my_new_car, my_old_car]
  • 包含的信息量可以是极大的,可以创建无穷多的实例
  • 高度的拟人(物)化,符合人类对客观世界的抽象和理解

第三部分 类的继承——class 子类名(父类名)

引子

  • 看一下人在生物界的分支链
    生物——动物界——脊索动物门——哺乳动物纲——灵长目——人科——人属——智人种
  • 公共特征逐渐增加的过程
  • 所谓继承,就是低层抽象继承高层抽象的过程

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):
        """获取总里程数"""
        print("行车总里程:{}公里".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 ElectricCar(Car):
    """模拟电动汽车"""
    
    def __init__(self, brand, model, year):
        """初始化电动汽车属性"""
        super().__init__(brand, model, year)  # 初始化父类的属性
  • 自动继承父类的所有方法
my_electric_car = ElectricCar("NextWeek", "FF91", 2046)
my_electric_car.get_main_information()
品牌:NextWeek   型号:FF91   出厂年份:2046

3.2 给子类添加属性和方法

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_electric_quantity(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))              


my_electric_car = ElectricCar("NextWeek", "FF91", 2046, 70)
my_electric_car.get_electric_quantity()            # 获取当前电池电量
my_electric_car.get_remainder_range()             # 获取当前剩余可行驶里程

my_electric_car.set_electric_quantity(50)         # 重设电池电量
my_electric_car.get_electric_quantity()            # 获取当前电池电量
my_electric_car.get_remainder_range()             # 获取当前剩余可行驶里程
当前电池剩余电量:70 kW.h
当前电量还可以继续驾驶 350 公里
当前电池剩余电量:50 kW.h
当前电量还可以继续驾驶 250 公里

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_quantity(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))


my_electric_car = ElectricCar("NextWeek", "FF91", 2046, 70)
my_electric_car.get_main_information()
品牌:NextWeek   型号:FF91   出厂年份:2046   续航里程:350 公里

第四部分 用在类中的实例

  • 把电池抽象成一个对象
  • 逻辑更加清晰
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_quantity(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))


class ElectricCar(Car):
    """模拟电动汽车"""
    
    def __init__(self, brand, model, year, bettery_size):
        """初始化电动汽车属性"""
        super().__init__(brand, model, year)    # 声明继承父类的属性
        self.bettery = Bettery(bettery_size)    # 电池
    
    def get_main_information(self):        # 方法名不变,重写父类方法,优先调用子类方法
        """获取汽车主要信息"""
        print("品牌:{}   型号:{}   出厂年份:{}   续航里程:{} 公里"
              .format(self.brand, self.model, self.year, 
              self.bettery.bettery_size*self.bettery.electric2distance_ratio))


my_electric_car = ElectricCar("NextWeek", "FF91", 2046, 70)
my_electric_car.get_main_information()                  # 获取车辆主要信息
my_electric_car.bettery.get_electric_quantity()          # 获取当前电池电量

my_electric_car.bettery.set_electric_quantity(50)       # 重设电池电量
my_electric_car.bettery.get_electric_quantity()          # 获取当前电池电量 
my_electric_car.bettery.get_remainder_range()           # 获取当前剩余可行驶里程   
品牌:NextWeek   型号:FF91   出厂年份:2046   续航里程:350 公里
当前电池剩余电量:70 kW.h
当前电池剩余电量:50 kW.h
当前电量还可以继续驾驶 250 公里
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值