• Python —— 类和对象


    1、类

    1、认识类

    1、定义类:  class  类名(遵循驼峰命名),类可以从字面意思上了解,就是一类事物的统称,植物、水果、大海、大山等,都是一类事物,例如:class Car:定义一个车类;class Fruit:定义一个水果类

    2、类的特性:

    1、类中会定义这个类共有的特点和状态,可以理解为这类事物的属性和方法

    2、类可以调用自己的属性,但是 不可调用它对象的属性

    写一个简单的类了解一下:

    1. # 定义一个车类
    2. class Car:
    3. # 定义类的2个属性
    4. wheel = "车轮子"
    5. isNewEnergy = True

    2、类中的init方法

    1、概述:

    1、init方法在类定义的时候,就会给对象定义实例属性

    2、初始化对象过程:函数的名字是固定的不能变

    2、实例化对象的过程,会调用init方法

    4、实例属性都会在init函数里去定义,基本上不会在外面去定义

    5、init方法没有返回值,不能写 return,写了默认是None

    6、类的方法可以调用了init函数中的属性,需要加 self,例如:self.属性名

    如下举例:

    1. # 定义类
    2. class Car:
    3. # 定义类的属性
    4. wheel = "四个轮子"
    5. engine = True
    6. # 定义init方法,并且在init中定义了2个对象的属性,cl和lg
    7. def __init__(self, cl, lo):
    8. self.color = cl
    9. self.logo = lo
    10. print(f"正在生成一辆车···")
    11. print(f"车的颜色是{self.color}的,车的品牌是{self.logo}")
    12. # 初始化的时候,会调用init函数,一定要写init函数里面的形参,并且个数要对上
    13. my_car = Car("黑色","奥迪");
    14. print(my_car.logo)
    15. # 类不能调用实例属性,在init方法中的基本上都是实例属性
    16. print(Car.logo) # AttributeError: type object 'Car' has no attribute 'logo'
    17. # 类可以调用自己的属性
    18. Car.wheel # 输出 四个轮子
    2、init方法将属性写为常量

    init方法中的参数设置值,设置后就是一个默认值,但是在初始化对象时可以修改属性值

    1. class Car:
    2. wheel = "四个轮子"
    3. engine = True
    4. # 定义init方法,并给对象的属性赋值
    5. def __init__(self,cl = "黑色",lg = "五菱神车"):
    6. self.color = cl
    7. self.logo = lg
    8. print(f"我正在开着一辆{self.color}{self.logo}在兜风~")
    9. # 实例化一个对象,会使用默认的属性值
    10. her_car = Car() # 输出:我正在开着一辆黑色的五菱神车在兜风~
    11. # 在初始化时,可以修改init方法中的属性值
    12. he_car = Car("白色","特斯拉") # 输出:我正在开着一辆白色的特斯拉在兜风~

    3、self 关键字解读

    1、概述

    1、self指的就是对象本身,类里面的方法默认会自己加上self,用来表示一个对象

    2、self 变量可以改名字,但是不建议修改

    3、在类里面定义实例属性,一定要加self,表示这是一个实例对象的属性,不加会报错

    4、类中的方法

    类中的方法等价于在类里面写函数,类中的函数,类和类的对象都可以调用,举例如下:

    2、对象

    定义对象:建立在类的基础上,先有类再有对象,可以使用 对象名 = 类名() 来定义一个对象,对象可以调用类中的方法和属性,也可以修改类中init函数的参数值

    3、属性

    概述:

    1、类/对象的特征和状态,例如:车类,它有颜色、logo、车轮、油车还是电车

    2、可以通过类获取,也可以通过对象获取

    3、可以修改、增加类的属性值

    4、在对象(实例)中,属性是个体有的,非这个类都有的,例如:水果中,香蕉的皮是黄色的,火龙果的皮是玫红色的,这就是他们的个体特性

    5、对象修改属性,修改的都是对象个体的属性,非整个类或者所有这个类的对象的属性

    备注:一般对象属性使用较类的属性多,因此后续大部分情况都会定义为实例的属性

    1、动态属性(反射)

    1、概述
    动态属性就是给类和对象设置属性、获取属性、删除属性、修改属性的操作,主要是用在项目中,一些测试数据不能提前在设计测试用例的时候,必须是测试运行起来中间产生的数据,例如:

    - token:登录成功后反悔了token,用户鉴权令牌

    - 项目创建后,产生的id

    以上这2种,需要动态添加,不能使用init函数初始化、提前设置

    2、动态属性的关键字
    1. hasattr(对象/类,"属性名"): 判断类/对象是否有属性 ,结果是布尔值 ——True  False
    2. getattr(对象/类,"属性名"): 获取类/对象的属性的值
    3. delattr(对象/类,"属性名"): 删除类/对象的属性

    使用举例:

    1. class Car:
    2. wheel = "True"
    3. engine = "True"
    4. def __init__(self,cl = "白色",lg = "宝马"):
    5. self.name = "四个轮子的车车"
    6. self.color = cl
    7. self.logo = lg
    8. print("正在生成一俩车")
    9. def driving(self):
    10. print("正在行驶哦~")
    11. # 使用动态属性添加元素
    12. setattr(Car,"speed","350km/h")
    13. print(Car.speed)
    14. # 删除一个元素
    15. deleteAttr = delattr(Car,"wheel")
    16. print(deleteAttr)
    17. # print(Car.wheel) # 报错,已经没有这个元素了
    18. Traceback (most recent call last):
    19. File "E:\python310\py001\类和对象2\pratices\动态属性.py", line 19, in
    20. print(Car.wheel) # 报错
    21. AttributeError: type object 'Car' has no attribute 'wheel'
    22. # 判断当前类是否有该元素
    23. speed = hasattr(Car,"speed")
    24. print(speed)

    4、扩展

    1、已知参数类型,进行传参

    在写函数的时候,如果参数确定类型,那么可以使用一下方式,这样在函数中也可以调用这个类型的对象的方法和属性,如下举例:

    1. # 先定义一个类
    2. class Fruit:
    3. apple = "青苹果"
    4. banana = "绿香蕉"
    5. def __init__(self):
    6. self.ftuits = []
    7. def add_fruit(self,name):
    8. if name in self.ftuits:
    9. print("此种水果已经在水果种类里~")
    10. else:
    11. self.ftuits.append(name)
    12. print("添加成功~")
    13. # 定义一个函数
    14. def get_fruit(obj: Fruit):
    15. obj.apple
    16. obj.banana
    17. obj.add_fruit("猕猴桃")
    18. fruit = Fruit()
    19. get_fruit(fruit) # 输出 添加成功

    2、init函数中设置常量

    1. # 写一个车类
    2. class Car:
    3. wheel = "True"
    4. engine = "True"
    5. def __init__(self,name,cl = "白色",lg = "宝马"):
    6. self.name = "四个轮子的车车"
    7. self.color = cl
    8. self.logo = lg
    9. print("正在生成一俩车")
    10. print(f"{self.name}车的颜色是{self.color},品牌是{self.logo}")
    11. # 实例化一个车对象,传递3个参数
    12. new_car1 = NewEnergyCar("五个轮子的","黑色","五菱神车")
    13. 输出:
    14. 正在生成一俩车
    15. 四个轮子的车车车的颜色是黑色,品牌是五菱神车
    16. # 实例化一个车对象,传递2个参数
    17. new_car2 = NewEnergyCar("粉色的","五菱")
    18. 输出:
    19. 正在生成一俩车
    20. 四个轮子的车车车的颜色是五菱,品牌是宝马
    21. ######结论:直接在init函数中赋值的,就是对象的常量,在初始化时,是否传参不会报错,对结果无影响######

    3、给类添加属性有2种方式

    1. 直接添加
    2. 使用动态方法添加

    看如下例子:

    1. # 方式一
    2. Car.speed = "350km/h"
    3. # 方式二
    4. setattr(Car,"speed","350km/h")

    5、继承

    1、一重继承

    1、继承的概述

    类比生活中的例子,类似于“皇位继承”,而在代码中集成的好处是,可以不要从0开始写代码,可以继承父类的方法和属性直接继承过来。

    2、继承的特点

    1、类的继承是语法:直接在括号里写另外一个类的名字,例如:class NewCar(Car),就是NewCar类继承了Car类,可以继承父类的所有方法和属性

    2、子类可以写自己的方法,父类不能使用子类的方法

    3、子类还可以重写父类的方法:子类方法跟父类同名的方法,会使用子类的方法(相当于子类重写了父类的方法,init函数也不例外)

    4、子类可以多继承和多层继承:同时继承多个父类,拥有多个父类的属性和方法

    简单举例:

    1. class Car:
    2. wheel = "True"
    3. engine = "True"
    4. def __init__(self,cl = "白色",lg = "宝马"):
    5. self.color = cl
    6. self.logo = lg
    7. print("正在生成一俩车")
    8. print(f"车的颜色是{self.color},品牌是{self.logo}")
    9. def driving(self):
    10. print("正在开车···")
    11. # 调用实例的属性
    12. print(f"我开车的颜色是{self.color},品牌是{self.logo}")
    13. # 调用方法
    14. self.recharge()
    15. def recharge(self):
    16. print(f"我的小车车正在充电~")
    17. # 写一个新的类,继承 Car
    18. class NewEnergyCar(Car):
    19. # 如果在子类里写init方法,相当于重写了父类的init方法,子类的对象就不能调用父类的方法和属性了
    20. def __init__(self,isnew):
    21. self.isnew = isnew
    22. print(f"这是一辆{isnew}车")
    23. def save_money(self):
    24. print("新能源车可以省钱~")
    25. new_car = NewEnergyCar("黑色")
    26. new_car.recharge()
    27. print(new_car.wheel)
    28. # 输出:
    29. 这是一辆黑色车
    30. 我的小车车正在充电~
    31. True
    32. # 如果按照父类的init的方法去实例化一个对象,则会报错
    33. new_car1 = NewEnergyCar("黑色","五菱神车")
    34. # 输出报错,这是因为子类重写了父类的init方法,就不能再用父类的init参数,去实例化对象了
    35. Traceback (most recent call last):
    36. File "E:\python310\py001\类和对象2\pratices\d2_类的继承.py", line 36, in
    37. new_car1 = NewEnergyCar("黑色","五菱神车")
    38. TypeError: __init__() takes 2 positional arguments but 3 were given

    注释掉子类的init方法后,可以继续使用父类的init函数参数初始化对象,如下举例:

    1. new_car1 = NewEnergyCar("黑色","五菱神车")
    2. # 输出
    3. 正在生成一俩车
    4. 车的颜色是黑色,品牌是五菱神车

    2、多重继承

    多重继承,即一个类有多个父类,这个类的对象,可以调用所有负累的属性和方法,举列如下:

    1. class Car:
    2. wheel = "True"
    3. engine = "True"
    4. def __init__(self,cl = "白色",lg = "宝马"):
    5. self.name = "四个轮子的车车"
    6. self.color = cl
    7. self.logo = lg
    8. print("正在生成一俩车")
    9. print(f"{self.name}车的颜色是{self.color},品牌是{self.logo}")
    10. def driving(self):
    11. print("正在开车···")
    12. # 调用实例的属性
    13. print(f"我开车的颜色是{self.color},品牌是{self.logo}")
    14. # 调用方法
    15. self.recharge()
    16. def recharge(self):
    17. print(f"我的小车车正在充电~")
    18. # 写一个新的类,继承 Car
    19. class NewEnergyCar(Car):
    20. def save_money(self):
    21. print("新能源车可以省钱~")
    22. class Robotcar():
    23. def AITools(self):
    24. print("语音识别功能~")
    25. # 继承2个类
    26. class AutoCar(NewEnergyCar,Robotcar):
    27. def info(self):
    28. print("我继承了2个类")
    29. # 这个对象可以调用所有继承类的方法
    30. auto_car = AutoCar()
    31. auto_car.AITools()
    32. auto_car.info()
    33. # 输出
    34. 正在生成一俩车
    35. 四个轮子的车车车的颜色是白色,品牌是宝马
    36. 语音识别功能~
    37. 我继承了2个类

    备注,需要注意如下情况,Car类中的init函数有常量,那么在子实例化时,需要加上这个变量,不然会报错:

    1. class Car:
    2. wheel = "True"
    3. engine = "True"
    4. def __init__(self,name,cl = "白色",lg = "宝马"):
    5. # 此时name就是一个常量
    6. self.name = "四个轮子的车车"
    7. self.color = cl
    8. self.logo = lg
    9. print("正在生成一俩车")
    10. # 则 AutoCar的对象需要这样写
    11. autoCar = AutoCar("随便写")
    12. # 不写会报错
    13. autoCar = AutoCar()
    14. 错误信息:
    15. Traceback (most recent call last):
    16. File "E:\python310\py001\类和对象2\pratices\d2_类的继承.py", line 35, in
    17. auto_car = AutoCar()
    18. TypeError: __init__() missing 1 required positional argument: 'name'

  • 相关阅读:
    南丁格尔玫瑰图
    Unity技术手册 - 创建物体有几种方式?
    图像运算和图像增强十一
    第十一章 数据库技术 11.1- 术语 11.2-关系数据库的相关术语
    Paper Time|开放式时空大数据助力智能公交路线规划
    Jmeter性能测试基础系列❤
    基于深度神经网络的社交媒体用户级心理压力检测
    【编程题】【Scratch三级】2020.09 青蛙捕虫
    springboot吕梁学院导师制管理系统毕业设计源码251022
    Aspose.Cells 单元格格式设置 如设置为数字
  • 原文地址:https://blog.csdn.net/lzf_hlh/article/details/133035174