• Python面向对象


    目录

    1.初识对象

    2. 类的成员方法

    3. 类和对象

    4. 构造方法

    5. 其它内置方法

    6. 封装

    7. 继承

    7.1 继承的基础语法

    7.2 复写和调用父类成员

    8. 多态


    1.初识对象

    1. 生活中或是程序中,我们都可以使用设计表格、生产表格、填写表格的形式组织数据。

    2. 进行对比,在程序中:

    设计表格,称之为:设计类(class)

    打印表格,称之为:创建对象

    填写表格,称之为:对象属性赋值

    1. # 设计类
    2. class Student:
    3. name = None
    4. age = None
    5. sex = None
    6. # 创建对象
    7. stu_1 = Student()
    8. # 对象属性赋值
    9. stu_1.name = "张三"
    10. stu_1.age = 18
    11. stu_1.sex = "男"
    12. # 张三
    13. print(stu_1.name)
    14. # 18
    15. print(stu_1.age)
    16. # 男
    17. print(stu_1.sex)

    2. 类的成员方法

    1.类是由哪两部分组成?

    • 类的属性:成员变量。
    • 类的行为:成员方法。

    注意:函数是定义在类外的,而方法是定义类内的。

    2.类和成员方法的定义语法

    3.self的作用

    • self表示类对象本身的作用。
    • 只有通过self,成员方法才能访问类的成员变量。
    • self虽然出现在形参列表中,但是不占用参数位置。
    1. class Student:
    2. name = None
    3. def say_hi(self):
    4. print(f"大家好,我是{self.name},请多多指教!")
    5. def say_hi2(self,msg):
    6. print(f"大家好,我是{self.name},{msg}")
    7. stu1 = Student()
    8. stu1.name = "张三"
    9. stu1.say_hi()
    10. stu2 = Student()
    11. stu2.name = "李四"
    12. stu2.say_hi2("请多多关照!")

    3. 类和对象

    1. 现实世界的事物由什么组成?

    • 属性
    • 行为

    类也可以包含属性和行为,所以使用类描述现实世界事物是非常合适的。

    2. 类和对象的关系是什么?

    • 类是程序中的“设计图纸”。
    • 对象是基于图纸生产的具体实体。

    3. 什么是面向对象编程

    • 面向对象编程就是,使用对象进行编程。
    • 即,设计类,基于类创建对象,并使用对象来完成具体的工作。
    1. # 设计类
    2. class Clock:
    3. # 序列号
    4. id = None
    5. # 零售价
    6. price = None
    7. # 响铃
    8. def ring(self):
    9. import winsound
    10. winsound.Beep(2000,3000)
    11. # 创建对象
    12. clock1 = Clock()
    13. # 给对象属性赋值
    14. clock1.id = "1001"
    15. clock1.price = 19.99
    16. # 使用对象的属性和方法
    17. print(f"闹钟ID:{clock1.id},价格:{clock1.price}")
    18. clock1.ring()
    19. # 创建对象
    20. clock2 = Clock()
    21. # 给对象属性赋值
    22. clock2.id = "1002"
    23. clock2.price = 29.99
    24. # 使用对象的属性和方法
    25. print(f"闹钟ID:{clock2.id},价格:{clock2.price}")
    26. clock2.ring()

    4. 构造方法

    1.构造方法的名称:

    __init__,注意init前后的2个下划线符号。

    2.构造方法的作用:

    构建类对象的时候会自动运行

    构建类对象的传参会传递给构造方法,借此特性可以给成员变量赋值

    3.注意事项:

    构造方法不要忘记self关键字。

    在方法内使用成员变量需要使用self。

    案例

    1. # 设计类
    2. class Student:
    3. # # 成员变量
    4. # name = None
    5. # age = None
    6. # address = None
    7. # 构造方法
    8. def __init__(self,name,age,address):
    9. self.name = name
    10. self.age = age
    11. self.address = address
    12. # 循环录入学生信息并打印学生信息
    13. for i in range(3):
    14. print(f"当前录入第{i+1}学生信息,总共需要录入2位学生信息")
    15. name = input("请输入姓名:")
    16. age = input("请输入年龄:")
    17. address = input("请输入地址:")
    18. # 创建对象
    19. stu = Student(name,age,address)
    20. # 打印学生信息
    21. print(f"学生{i+1}信息录入完成,信息为:【姓名:{stu.name},年龄:{stu.age},地址:{stu.address}】")
    22. print("-"*47)

    5. 其它内置方法

    方法

    功能

    __init__

    构造方法,可用于创建类对象的时候设置初始化行为

    __str__

    用于实现类对象转字符串的行为

    __lt__

    用于2个类对象进行小于或大于比较

    __le__

    用于2个类对象进行小于等于或大于等于比较

    __eq__

    用于2个类对象进行相等比较

    1. class Student:
    2. # __init__构造方法
    3. def __init__(self,name,age):
    4. self.name = name
    5. self.age = age
    6. # __str__字符串方法
    7. def __str__(self):
    8. return f"name={self.name},age={self.age}"
    9. # __lt__小于符号比较方法
    10. def __lt__(self, other):
    11. return self.age < other.age
    12. # __le__小于等于比较方法
    13. def __le__(self, other):
    14. return self.age <= other.age
    15. # __eq__比较运算符实现方法
    16. def __eq__(self, other):
    17. return self.age == other.age
    18. stu1 = Student("张三",20)
    19. stu2 = Student("李四",21)
    20. stu3 = Student("王五",20)
    21. '''
    22. 调用__str__字符串方法
    23. '''
    24. # name=张三,age=20
    25. print(stu1)
    26. # name=李四,age=21
    27. print(str(stu2))
    28. '''
    29. __lt__小于符号比较方法
    30. '''
    31. # True
    32. print(stu1 < stu2)
    33. # False
    34. print(stu1 > stu2)
    35. '''
    36. __le__小于等于比较方法
    37. '''
    38. # True
    39. print(stu1 <= stu3)
    40. # False
    41. print(stu1 >= stu2)
    42. '''
    43. __eq__比较运算符实现方法
    44. '''
    45. # 若不实现__eq__方法,对象之间可以比较,但是比较的是对象的内存地址
    46. # 若实现__eq__方法,就按照自己的想法来决定2个对象是否相等
    47. # True
    48. print(stu1 == stu3)

    6. 封装

    1.封装的概念?

    将现实世界事物在类中描述为属性和方法,即为封装。

    2.什么是私有成员?为什么需要私有成员?

    现实事物有部分属性和行为是不公开对使用者开放的。同样在类中描述属性和方法的时候也需要达到这个要求,这就需要定义私有成员了。

    3.如何定义私有成员?

    成员变量和成员方法的命名均以__作为开头即可。

    4.私有成员的访问限制?

    • 类中的其它成员可以访问私有成员。
    • 类对象无法访问私有成员。

    案例

    1. class Phone:
    2. # 私有成员变量(对用户隐藏)
    3. __is_5g_enable = False # 5g状态
    4. # 私有成员方法(对用户隐藏)
    5. def __check_5g(self):
    6. if self.__is_5g_enable:
    7. print("5g开启")
    8. else:
    9. print("5g关闭,使用4g网络")
    10. # 公开成员方法(对用户公开)
    11. def call_by_5g(self):
    12. self.__check_5g()
    13. print("正在通话中")
    14. phone = Phone()
    15. phone.call_by_5g()

    7. 继承

    7.1 继承的基础语法

    1.什么是继承?

    继承就是一个类,继承另外一个类的成员变量和成员方法。

    语法:

    子类构建的类对象,可以:

    • 使用父类的成员变量和成员方法。
    • 有自己的成员变量和成员方法。

    2.单继承和多继承

    单继承:一个类继承另一个类。

    多继承:一个类继承多个类,按照顺序从左到右依次继承。

    多继承中,如果父类有同名方法和属性,先继承的优先级高于后继承。

    3.pass关键字的作用

    pass是占位语句,用来保证函数(方法)或类定义的完整性,表示无内容,空的意思。

    1. '''
    2. 单继承
    3. '''
    4. class Phone:
    5. # 序列号
    6. IMEI = None
    7. # 厂商
    8. producer = "HW"
    9. def call_by_4g(self):
    10. print("4g通话")
    11. class Phone2022(Phone):
    12. # 面部识别
    13. face_id = True
    14. def call_by_5g(self):
    15. print("2022最新5g通话")
    16. Phone2022 = Phone2022()
    17. # 4g通话
    18. Phone2022.call_by_4g()
    19. # 2022最新5g通话
    20. Phone2022.call_by_5g()
    21. '''
    22. 多继承
    23. '''
    24. class NFCReader:
    25. nfc_type = "第五代"
    26. producer = "HM"
    27. def read_card(self):
    28. print("读取NFC卡")
    29. def write_card(self):
    30. print("写入NFC卡")
    31. class MyPhone(Phone,NFCReader):
    32. pass
    33. my_phone = MyPhone()
    34. # 4g通话
    35. my_phone.call_by_4g()
    36. # 读取NFC卡
    37. my_phone.read_card()
    38. # 多个父类中,如果有同名的成员,那么默认以继承顺序(从左到右)为优先级
    39. # HW
    40. print(my_phone.producer)

    7.2 复写和调用父类成员

    1.复写表示:

    对父类的成员属性或成员方法重新定义。

    2.复写语法:

    在子类中重新实现同名成员方法或成员属性即可。

    3.在子类中,如何调用父类成员?

     注意:只可以在子类内部调用父类的同名成员,子类的实体类对象调用默认是调用子类复写的。

    1. class Phone:
    2. IMEI = None
    3. producer = "ITCAST"
    4. def call_by_5g(self):
    5. print("父类的5g通话")
    6. # 子类1复写父类的成员属性和成员方法
    7. class MyPhone1(Phone):
    8. producer = "ITHEIMA"
    9. def call_by_5g(self):
    10. print("子类的5g通话")
    11. # 子类2复写父类的成员属性和成员方法,并在成员方法中调用父类成员
    12. class MyPhone2(Phone):
    13. producer = "ITHEIMA"
    14. def call_by_5g(self):
    15. # # 方式1调用父类成员
    16. # print(f"父类的品牌是:{Phone.producer}")
    17. # Phone.call_by_5g(self)
    18. # 方式2调用父类成员
    19. print(f"父类的品牌是:{super().producer}")
    20. super().call_by_5g()
    21. print("子类的5g通话")
    22. '''
    23. 子类的实体类对象调用的成员默认是调用子类复写的。
    24. '''
    25. my_phone1 = MyPhone1()
    26. # ITHEIMA
    27. print(my_phone1.producer)
    28. # 子类的5g通话
    29. my_phone1.call_by_5g()
    30. my_phone2 = MyPhone2()
    31. # 父类的品牌是:ITCAST
    32. # 父类的5g通话
    33. # 子类的5g通话
    34. my_phone2.call_by_5g()

    8. 多态

    1.什么是多态?

    多态指的是,同一个行为,使用不同的对象获得不同的状态。 如,定义函数(方法),通过类型注解声明需要父类对象,实际传入子类对象进行工作,从而获得不同的工作状态。

    2.什么是抽象类(接口)?

    包含抽象方法的类,称之为抽象类。抽象方法是指:没有具体实现的方法(pass)称之为抽象方法。

    3.抽象类的作用

    多用于做顶层设计(设计标准),以便子类做具体实现。 也是对子类的一种软性约束,要求子类必须复写(实现)父类的一些方法并配合多态使用,获得不同的工作状态。

    1. # 设计抽象类
    2. class Animal:
    3. def speak(self):
    4. pass
    5. class Dog(Animal):
    6. def speak(self):
    7. print("汪汪汪")
    8. class Cat(Animal):
    9. def speak(self):
    10. print("喵喵喵")
    11. # 定义函数,实现多态
    12. def make_noise(animal: Animal):
    13. animal.speak()
    14. dog = Dog()
    15. cat = Cat()
    16. # 汪汪汪
    17. make_noise(dog)
    18. # 喵喵喵
    19. make_noise(cat)

  • 相关阅读:
    项目性能优化—性能优化的指标、目标
    ​Mysql数据库查询好慢,除了索引,还能因为什么?
    第一章 软考架构师之计算机系统组成与体系结构
    微服务架构之:Redis的分布式锁---搭建生产可用的Redis分布式锁
    大型语言模型:DistilBERT — 更小、更快、更便宜、更轻
    【论文爬虫】自动将论文详细信息直送notion并自动下载(含源码)
    【leetcode】 盛最多水的容器
    【图解计算机网络】网络协议分层解析
    【Verilog】inout 端口信号的使用
    2023年【汽车驾驶员(中级)】报名考试及汽车驾驶员(中级)证考试
  • 原文地址:https://blog.csdn.net/m0_60121089/article/details/127825747