当前位置:   article > 正文

Python的面向对象从入门到精通(简单易懂)_开学了有一批学生信息需要录入系统,请设计一个类,记录学生的:姓名、年龄、地址三

开学了有一批学生信息需要录入系统,请设计一个类,记录学生的:姓名、年龄、地址三

目录

1 初识对象

2. 成员方法

 3. 类和对象

4. 构造方法

5. 其它内置方法

6. 封装

7. 继承

 8. 复写

9. 类型的注解

10. 多态


1 初识对象

1. 生活中或是程序中,我们都可以使用设计表格、生产表格、填写表格的形式组织数据
2. 进行对比,在程序中:
设计表格,称之为:设计类(class)
打印表格,称之为:创建对象
填写表格,称之为:对象属性赋值

2. 成员方法

1.类的定义与使用

我们简单了解到可以使用类去封装属性,并基于类创建出一个个的对象来使用。
现在我们来看看类的使用语法:

  1. class Student:
  2. name = None #成员变量
  3. def speak(self):
  4. print("hello world!")#成员方法

  • class是关键字,表示要定义类了
  • 类的属性,即定义在类中的变量(成员变量)
  • 类的行为,即定义在类中的函数(成员方法)

创建类对象的语法:

2.成员变量和成员方法

总结:

 

  1. """
  2. 演示面向对象类中的成员方法定义和使用
  3. """
  4. # 定义一个带有成员方法的类
  5. class Student:
  6. name = None # 学生的姓名
  7. def say_hi(self):
  8. print(f"大家好呀,我是{self.name},欢迎大家多多关照")
  9. def say_hi2(self, msg):
  10. print(f"大家好,我是:{self.name}{msg}")
  11. stu = Student()
  12. stu.name = "周杰轮"
  13. stu.say_hi2("哎哟不错哟")
  14. stu2 = Student()
  15. stu2.name = "林俊节"
  16. stu2.say_hi2("小伙子我看好你")

 3. 类和对象

基于类创建对象的语法:
为什么非要创建对象才能使用呢?
类只是一种程序内的“设计图纸”,需要基于图纸生产实体(对象),才能正常工作
这种套路,称之为:面向对象编程

 

  1. """
  2. 演示类和对象的关系,即面向对象的编程套路(思想)
  3. """
  4. # 设计一个闹钟类
  5. class Clock:
  6. id = None # 序列化
  7. price = None # 价格
  8. def ring(self):
  9. import winsound
  10. winsound.Beep(2000, 3000)
  11. # 构建2个闹钟对象并让其工作
  12. clock1 = Clock()
  13. clock1.id = "003032"
  14. clock1.price = 19.99
  15. print(f"闹钟ID:{clock1.id},价格:{clock1.price}")
  16. # clock1.ring()
  17. clock2 = Clock()
  18. clock2.id = "003033"
  19. clock2.price = 21.99
  20. print(f"闹钟ID:{clock2.id},价格:{clock2.price}")
  21. clock2.ring()

4. 构造方法

 

  1. """
  2. 演示类的构造方法
  3. """
  4. # 演示使用构造方法对成员变量进行赋值
  5. # 构造方法的名称:__init__
  6. class Student:
  7. def __init__(self, name, age ,tel):
  8. self.name = name
  9. self.age = age
  10. self.tel = tel
  11. print("Student类创建了一个类对象")
  12. stu = Student("周杰轮", 31, "18500006666")
  13. print(stu.name)
  14. print(stu.age)
  15. print(stu.tel)

练习:学生信息的录入:

开学了有一批学生信息需要录入系统,请设计一个类,记录学生的:
姓名、年龄、地址,这3类信息
请实现:

  • 通过for循环,配合input输入语句,并使用构造方法,完成学生信息的键盘录入
  • 输入完成后,使用print语句,完成信息的输出
  1. """
  2. 学生信息录入
  3. """
  4. # 定义学生类
  5. class Student:
  6. name = None #学生姓名
  7. age = None #学生年龄
  8. address = None #学生的地址
  9. def __init__(self,name,age,address):
  10. self.name = name
  11. self.age = age
  12. self.address = address
  13. # 输入学生信息
  14. num_students = int(input("请输入学生的数量:"))
  15. for i in range(num_students):
  16. print(f"请输入第{i+1}位学生的信息")
  17. name = input("姓名:")
  18. age = input("年龄:")
  19. address = input("地址:")
  20. student = Student(name,age,address)
  21. print(f"第{i+1}位学生,name={name},age={age},address={address}")

5. 其它内置方法

 1. _str_ 字符串方法


当类对象需要被转换为字符串之时,会输出如上结果(内存地址)

内存地址没有多大作用,我们可以通过__str__方法,控制类转换为字符串的行为。

2. _lt_ 小于符号的比较方法

 3. __le__ 小于等于比较符号方法

 4. _eq_

 

  1. """
  2. 演示Python内置的各类魔术方法
  3. """
  4. class Student:
  5. def __init__(self, name, age):
  6. self.name = name # 学生姓名
  7. self.age = age # 学生年龄
  8. # __str__魔术方法
  9. def __str__(self):
  10. return f"Student类对象,name:{self.name}, age:{self.age}"
  11. # __lt__魔术方法
  12. def __lt__(self, other):
  13. return self.age < other.age
  14. # __le__魔术方法
  15. def __le__(self, other):
  16. return self.age <= other.age
  17. # __eq__魔术方法
  18. def __eq__(self, other):
  19. return self.age == other.age
  20. stu1 = Student("周杰轮", 31)
  21. stu2 = Student("林俊节", 36)
  22. print(stu1 == stu2)

6. 封装

面向对象的三大特性

 

私有成员

既然现实事物有不公开的属性和行为,那么作为现实事物在程序中映射的类,也应该支持。

类中提供了私有成员的形式来支持。

  • 私有成员变量
  • 私有成员方法

定义私有成员的方式非常简单,只需要:

  • 私有成员变量:变量名以__开头(2个下划线)
  • 私有成员方法:方法名以__开头(2个下划线)

即可完成私有成员的设置

 

 

 

  1. """
  2. 演示面向对象封装思想中私有成员的使用
  3. """
  4. # 定义一个类,内含私有成员变量和私有成员方法
  5. class Phone:
  6. __current_voltage = 0.5 # 当前手机运行电压
  7. def __keep_single_core(self):
  8. print("让CPU以单核模式运行")
  9. def call_by_5g(self):
  10. if self.__current_voltage >= 1:
  11. print("5g通话已开启")
  12. else:
  13. self.__keep_single_core()
  14. print("电量不足,无法使用5g通话,并已设置为单核运行进行省电。")
  15. phone = Phone()
  16. phone.call_by_5g()

 练习题:设计带有私有成员的手机

  1. class Phone:
  2. __is_5g_enable = None #type:bool
  3. #构造方法,为私有成员赋值
  4. def __init__(self,__is_5g_enble):
  5. self.__is_5g_enable =__is_5g_enble
  6. #判断5g的状态
  7. def __check_5g(self):
  8. if self.__is_5g_enable:
  9. print("5g开启")
  10. else:
  11. print("5g关闭,使用4g网络")
  12. #调用私有方法来查看5g的状态
  13. def call_by_5g(self):
  14. self.__check_5g()
  15. print("正在通话中")
  16. phone = Phone(True)
  17. phone.call_by_5g()
  18. phone = Phone(False)
  19. phone.call_by_5g()

运行结果:

7. 继承

 

 

 

  1. """
  2. 演示面向对象:继承的基础语法
  3. """
  4. # 演示单继承
  5. class Phone:
  6. IMEI = None # 序列号
  7. producer = "ITCAST" # 厂商
  8. def call_by_4g(self):
  9. print("4g通话")
  10. class Phone2022(Phone):
  11. face_id = "10001" # 面部识别ID
  12. def call_by_5g(self):
  13. print("2022年新功能:5g通话")
  14. phone = Phone2022()
  15. print(phone.producer)
  16. phone.call_by_4g()
  17. phone.call_by_5g()
  18. # 演示多继承
  19. class NFCReader:
  20. nfc_type = "第五代"
  21. producer = "HM"
  22. def read_card(self):
  23. print("NFC读卡")
  24. def write_card(self):
  25. print("NFC写卡")
  26. class RemoteControl:
  27. rc_type = "红外遥控"
  28. def control(self):
  29. print("红外遥控开启了")
  30. class MyPhone(Phone, NFCReader, RemoteControl):
  31. pass
  32. phone = MyPhone()
  33. phone.call_by_4g()
  34. phone.read_card()
  35. phone.write_card()
  36. phone.control()
  37. print(phone.producer)
  38. # 演示多继承下,父类成员名一致的场景

 8. 复写

 

 

  1. """
  2. 演示面向对象:继承中
  3. 对父类成员的复写和调用
  4. """
  5. class Phone:
  6. IMEI = None # 序列号
  7. producer = "ITCAST" # 厂商
  8. def call_by_5g(self):
  9. print("使用5g网络进行通话")
  10. # 定义子类,复写父类成员
  11. class MyPhone(Phone):
  12. producer = "ITHEIMA" # 复写父类的成员属性
  13. def call_by_5g(self):
  14. print("开启CPU单核模式,确保通话的时候省电")
  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("关闭CPU单核模式,确保性能")
  22. phone = MyPhone()
  23. phone.call_by_5g()
  24. print(phone.producer)
  25. # 在子类中,调用父类成员

9. 类型的注解

9.1 变量的类型注解

 

 

 

 

  1. #第一种方式的类型注解
  2. name:str = None
  3. age:int = None
  4. address = None
  5. #第二种方式的类型注解
  6. name = None #type:str
  7. age = None #type:int
  8. address = None #type:str

 

 

 

 

 

  1. """
  2. 演示变量的类型注解
  3. """
  4. # 基础数据类型注解
  5. import json
  6. import random
  7. # var_1: int = 10
  8. # var_2: str = "itheima"
  9. # var_3: bool = True
  10. # 类对象类型注解
  11. class Student:
  12. pass
  13. stu: Student = Student()
  14. # 基础容器类型注解
  15. # my_list: list = [1, 2, 3]
  16. # my_tuple: tuple = (1, 2, 3)
  17. # my_dict: dict = {"itheima": 666}
  18. # 容器类型详细注解
  19. my_list: list[int] = [1, 2, 3]
  20. my_tuple: tuple[int, str, bool] = (1, "itheima", True)
  21. my_dict: dict[str, int] = {"itheima": 666}
  22. # 在注释中进行类型注解
  23. var_1 = random.randint(1, 10) # type: int
  24. var_2 = json.loads('{"name": "zhangsan"}') # type: dict[str, str]
  25. def func():
  26. return 10
  27. var_3 = func() # type: int
  28. # 类型注解的限制
  29. var_4: int = "itheima"
  30. var_5: str = 123

 9.2 函数(方法)的类型注解

函数(方法)的类型注解 - 形参注解

def func(x:int,y:int)

 上述代码分别对func()函数的x、y形参注解为int类型

函数(方法)的类型注解 - 返回值注解

  1. def func(x:int,y:int) -> int:
  2. return x + y

 上述代码中 -> int 表示函数返回int的数据类型

代码演示

  1. """
  2. 演示对函数(方法)进行类型注解
  3. """
  4. # 对形参进行类型注解
  5. def add(x: int, y: int):
  6. return x + y
  7. # 对返回值进行类型注解
  8. def func(data: list) -> list:
  9. return data
  10. print(func(1))

9.3 Union类型

使用Union[类型,......,类型]

可以用来去定义联合类型的注解

Union联合类型注解,在变量注解、函数(方法)形参和返回值注解中,均可使用。

1. 什么是Union类型?
使用Union可以定义联合类型注解
2. Union的使用方式

  • 导包:from typing import Union
  • 使用:Union[类型, ......, 类型]

代码详解:

  1. """
  2. 演示Union联合类型注解
  3. """
  4. # 使用Union类型,必须先导包
  5. from typing import Union
  6. my_list: list[Union[int, str]] = [1, 2, "itheima", "itcast"]
  7. def func(data: Union[int, str]) -> Union[int, str]:
  8. pass

10. 多态

多态,指的是:多种状态,即完成某个行为时,使用不同的对象会得到不同的状态。
如何理解?

同样的行为(函数),传入不同的对象,得到不同的状态

 抽象类
 

  1. class Animal:
  2. def speak(self):
  3. pass

这种设计的含义是:

  • 父类用来确定有哪些方法
  • 具体的方法实现,由子类自行决定

这种写法,就叫做抽象类(也可以称之为接口)

抽象类:含有抽象方法的类称之为抽象类
抽象方法:方法体是空实现的(pass)称之为抽象方法

抽象类(接口)

抽象类就好比定义一个标准,
包含了一些抽象的方法,要求子类必须实现。

配合多态,完成

  • 抽象的父类设计(设计标准)
  • 具体的子类实现(实现标准)

  1. """
  2. 演示面向对象的多态特性以及抽象类(接口)的使用
  3. """
  4. class Animal:
  5. def speak(self):
  6. pass
  7. class Dog(Animal):
  8. def speak(self):
  9. print("汪汪汪")
  10. class Cat(Animal):
  11. def speak(self):
  12. print("喵喵喵")
  13. def make_noise(animal: Animal):
  14. """制造点噪音,需要传入Animal对象"""
  15. animal.speak()
  16. # 演示多态,使用2个子类对象来调用函数
  17. dog = Dog()
  18. cat = Cat()
  19. make_noise(dog)
  20. make_noise(cat)
  21. # 演示抽象类
  22. class AC:
  23. def cool_wind(self):
  24. """制冷"""
  25. pass
  26. def hot_wind(self):
  27. """制热"""
  28. pass
  29. def swing_l_r(self):
  30. """左右摆风"""
  31. pass
  32. class Midea_AC(AC):
  33. def cool_wind(self):
  34. print("美的空调制冷")
  35. def hot_wind(self):
  36. print("美的空调制热")
  37. def swing_l_r(self):
  38. print("美的空调左右摆风")
  39. class GREE_AC(AC):
  40. def cool_wind(self):
  41. print("格力空调制冷")
  42. def hot_wind(self):
  43. print("格力空调制热")
  44. def swing_l_r(self):
  45. print("格力空调左右摆风")
  46. def make_cool(ac: AC):
  47. ac.cool_wind()
  48. midea_ac = Midea_AC()
  49. gree_ac = GREE_AC()
  50. make_cool(midea_ac)
  51. make_cool(gree_ac)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/261598
推荐阅读
相关标签
  

闽ICP备14008679号