1.面向对象思想
现实世界的事物和类


2.定义
python
"""
演示类和对象的关系,即面向对象的编程套路(思想)
"""
# 设计一个闹钟类 class 类名 class是关键字,表示要定义类了
class Clock:
#类的属性,即定义在类中的变量(成员变量)
id = None # 序列化
price = None # 价格
def ring(self): # 类的行为,即定义在类中的函数(成员方法)
import winsound
winsound.Beep(2000, 3000) # 播放声音
# 构建2个闹钟对象并让其工作
clock1 = Clock()
clock1.id = "003032"
clock1.price = 19.99
print(f"闹钟ID:{clock1.id},价格:{clock1.price}")
# clock1.ring()
clock2 = Clock()
clock2.id = "003033"
clock2.price = 21.99
print(f"闹钟ID:{clock2.id},价格:{clock2.price}")
clock2.ring()
在类中定义成员方法和定义函数基本一致,但仍有细微区别:
self 关键字是成员方法定义的时候,必须填写的。
- 它用来表示类对象自身的意思
- 当我们使用类对象调用方法的是,self会自动被python传入
- 在方法内部,想要访问类的成员变量,必须使用self
python
def 方法名(self,形参1,....,形参N):
方法体
3.__init__ (前后都有2个下划线)构造方法
- 在创建类对象(构造类)的时候,会自动执行。
- 在创建类对象(构造类)的时候,将传入参数自动传递给__init__方法使用。
python
"""
演示类的构造方法
"""
# 演示使用构造方法对成员变量进行赋值
# 构造方法的名称:__init__
class Student:
#这里可以省略
# name=None
# age=None
# tel=None
# 在构造方法内定义成员变量,需要使用self关键字
# 这是因为:变量是定义在构造方法内部,如果要成为成员变量,需要用self来表示。
def __init__(self, name, age ,tel):
self.name = name
self.age = age
self.tel = tel
print("Student类创建了一个类对象")
stu = Student("周杰轮", 31, "18500006666")
print(stu.name)
print(stu.age)
print(stu.tel)
A.练习
通过for循环,配合input输入语句,并使用构造方法,完成学生信息的键盘录入
输入完成后,使用print语句,完成信息的输出
python
class Student:
def __init__(self,name,age,addr):
self.name=name
self.age=age
self.addr=addr
def print_info(self,l):
print(f"学生{l}信息录入完成,信息为:【学生姓名:{self.name},年龄:{self.age},地址:{self.addr}】")
print("----------------------------")
print("欢迎来到学生信息录入系统")
num=0
list_stu=[]
while True:
n = input("请输入学生姓名:")
a = input("请输入学生年龄:")
d = input("请输入学生地址:")
s = Student(n, a, d)
num += 1
s.print_info(num)
list_stu.append(s)
if num == 3:
print(f"已达到最大录入人数(3人),系统自动退出。")
# for循环实现 并取出下标
# 替代 for i in range(len(list_stu)):
for i, stu in enumerate(list_stu):
stu.print_info(i + 1) # i 从 0 开始,所以加 1
list_stu.clear()
break
4.其它魔术方法
| 方法 | 功能 |
|---|---|
__init__ |
构造方法,可用于创建类对象的时候设置初始化行为 |
__str__ |
用于实现类对象转字符串的行为 |
__lt__ |
用于2个类对象进行小于或大于比较 |
__le__ |
用于2个类对象进行小于等于或大于等于比较 |
__eq__ |
用于2个类对象进行相等比较 |
python
class Student:
def __init__(self,name,age,addr):
self.name=name
self.age=age
self.addr=addr
# 如果不定义__str__()方法,则打印对象时,打印的是对象内存地址
# 定义__str__()方法后,打印对象时,打印的是对象中定义的__str__()方法返回的字符串
def __str__(self):
return f"【学生姓名:{self.name},年龄:{self.age},地址:{self.addr}】"
# 定义__lt__()方法,实现比较按照年龄比较大小
# 例如:s1=Student("张三",18,"上海") s2=Student("李四",19,"北京") print(s1<s2) 直接比较对象 返回 True
def __lt__(self, other):
return self.age < other.age
# 添加__eq__()方法,实现比较按照年龄比较大小
# 例如:s1=Student("张三",18,"上海") s2=Student("李四",18,"北京") print(s1==s2) 直接比较对象 返回True
def __eq__(self, other):
return self.age == other.age
# 添加__le__()方法,<=、>=两种比较运算符上
def __len__(self,other):
return self.age <= other.age
定义私有成员变量和私有成员方法
python
"""
讲解面向对象-封装特性
设计带有私有成员的手机
"""
# 设计一个类,用来描述手机
class Phone:
# 提供私有成员变量:__is_5g_enable
__is_5g_enable = True # 5g状态
# 提供私有成员方法:__check_5g()
def __check_5g(self):
if self.__is_5g_enable:
print("5g开启")
else:
print("5g关闭,使用4g网络")
# 提供公开成员方法:call_by_5g()
def call_by_5g(self):
self.__check_5g()
print("正在通话中")
phone = Phone()
# phone.__is_5g_enable 直接访问报错 必须通过公开成员方法访问
phone.call_by_5g()