面向对象 Object Oriented
面向过程
1. 分析出解决问题的步骤,然后逐步实现。
例如:婚礼筹办
– 发请柬(选照片、措词、制作)
– 宴席(场地、找厨师、准备桌椅餐具、计划菜品、购买食材)
– 婚礼仪式(定婚礼仪式流程、请主持人)
2. 公式:程序 = 算法 + 数据结构
3. 优点:所有环节、细节自己掌控。
4. 缺点:考虑所有细节,工作量大。
面向对象
1. 找出解决问题的人,然后分配职责。
例如:婚礼筹办
– 发请柬:找摄影公司(拍照片、制作请柬)
– 宴席:找酒店(告诉对方标准、数量、挑选菜品)
– 婚礼仪式:找婚庆公司(对方提供司仪、制定流程、提供设备、执行)
2. 公式:程序 = 对象 + 交互
3. 优点
(1) 思想层面:
– 可模拟现实情景,更接近于人类思维。
– 有利于梳理归纳、分析解决问题。
(2) 技术层面:
– 高复用:对重复的代码进行封装,提高开发效率。
– 高扩展:增加新的功能,不修改以前的代码。
– 高维护:代码可读性好,逻辑清晰,结构规整。
4. 缺点:学习曲线陡峭。
类和对象
1. 类:一个**抽象**的概念,即生活中的”类别”。
2. 对象:类的**具体**实例,即归属于某个类别的”个体”。
3. 类是创建对象的”模板”。
– 数据成员:名词类型的状态。
– 方法成员:动词类型的行为。
4. 类与类行为不同,对象与对象数据不同。
语法
定义类
1. 代码
class 类名:
“”“文档说明”""
def init(self,参数列表):
self.实例变量 = 参数
"""
练习:创建狗类
数据: 爱称,品种,价格
行为: 叫
创建2个狗对象,分别调用叫的行为
"""
class Dog:
def __init__(self, pet_name = "", breed = "", price=3000):#初始化
self.pet_name = pet_name
self.breed = breed
self.price = price
def shout(self):#方法
print(self.pet_name, "旺旺叫")
# 2对象 2套数据
d01 = Dog("米咻","拉不拉多")
d02 = Dog("黑米","拉不拉多",3500)
# 1个方法被多个对象共享
d01.shout()
d02.shout()
2. 说明
– 类名所有单词首字母大写
– init 也叫构造函数,创建对象时被调用,也可以省略。
– self 变量绑定的是被创建的对象,名称可以随意。
创建对象(实例化)
变量 = 构造函数 (参数列表)
实例成员
1. 实例变量
1. 语法
(1) 定义:对象.变量名
(2) 调用:对象.变量名
2. 说明
(1) 首次通过对象赋值为创建,再次赋值为修改.
w01 = Wife()
w01.name = “丽丽”
w01.name = “莉莉”
(2) 通常在构造函数(init)中创建。
w01 = Wife(“丽丽”,24)
print(w01.name)
(3) 每个对象存储一份,通过对象地址访问。
3. 作用:描述某个对象的数据。
4. __dict__:对象的属性,用于存储自身实例变量的字典。
2. 实例方法
1. 语法
(1) 定义: def 方法名称(self, 参数列表):
方法体
(2) 调用: 对象地址.实例方法名(参数列表)
不建议通过类名访问实例方法
2. 说明
(1) 至少有一个形参,第一个参数绑定调用这个方法的对象,一般命名为"self"。
(2) 无论创建多少对象,方法只有一份,并且被所有对象共享。
3. 作用:表示对象行为。
"""
在终端中循环录入学生信息(名字,年龄,性别,成绩),
如果名字为空,结束录入,打印所有人的信息.
-- 创建学生类
-- 打印个人信息的行为
"""
class Student:
def __init__(self, name, age, sex, score):
self.name = name
self.age = age
self.sex = sex
self.score = score
def print_self(self):
print("我叫%s,今年%d岁了,性别%s,成绩是%d." % (self.name, self.age, self.sex, self.score))
list_studnet = []
while True:
name = input("请输入姓名:")
if name == "":
break
age = int(input("请输入年龄:"))
sex = input("请输入性别:")
score = float(input("请输入成绩:"))
stu = Student(name, age, sex, score)
list_studnet.append(stu)
for item in list_studnet:
item.print_self()
类成员
1. 类变量
1. 语法
(1) 定义:在**类中**,**方法外**定义变量。
class 类名:
变量名 = 表达式
(2) 调用:类名.变量名
不建议通过对象访问类变量
2. 说明
(1) 存储在类中。
(2) 只有一份,被所有对象共享。
3. 作用:描述所有对象的共有数据。
2. 类方法
1. 语法
(1) 定义:
@classmethod
def 方法名称(cls,参数列表):
方法体
(2) 调用:类名.方法名(参数列表)
不建议通过对象访问类方法
2. 说明
(1) 至少有一个形参,第一个形参用于绑定类,一般命名为’cls’
(2) 使用@classmethod修饰的目的是调用类方法时可以隐式传递类。
(3) 类方法中不能访问实例成员,实例方法中可以访问类成员。
3. 作用:操作类变量。
"""
对象计数器
创建老婆类,记录老婆对象的数量.
"""
class Wife:
count = 0 #定义类变量
@classmethod
def print_count(cls):
print("我已经娶了%d个老婆了"%cls.count)
def __init__(self, name):
self.name = name
Wife.count += 1
w01 = Wife("锤锤")
w02 = Wife("方方")
w03 = Wife("圆圆")
Wife.print_count() #调用类方法
最后,附上一个经典练习:
多多练习定义实例方法,调用实例变量,进行各种操作
class Student:
"""
学生
"""
def __init__(self, name, age, sex, score):
self.name = name
self.age = age
self.sex = sex
self.score = score
def print_self(self):
print("我叫%s,今年%d岁了,性别%s,成绩是%d." % (self.name, self.age, self.sex, self.score))
# 学生列表
list_student = [
Student("悟空", 27, "男", 100),
Student("八戒", 30, "男", 60),
Student("沙僧", 33, "男", 70),
Student("唐僧", 20, "女", 65),
]
# 1. 定义函数,在学生列表中查找姓名是八戒的学生对象
# 测试,将对象的信息打印在终端中
def find01():
for item in list_student:
if item.name == "八戒2":
return item
stu = find01() #定义变量接收返回值
if stu: #判断是否为空,再进行打印
stu.print_self() # None.print_self()
# 2. 定义函数,在学生列表中查找成绩大于60分的所有学生对象
# 测试,将所有对象的信息打印在终端中
def find02():
list_result = []
for item in list_student:
if item.score > 60:
list_result.append(item)
return list_result
find02()
for item in find02():
item.print_self()
# 3. 定义函数,在学生列表中查找成所有年龄大于30的学生姓名
# 测试,将所有姓名打印在终端中
def find03():
list_name = []
for item in list_student:
if item.age > 30:
list_name.append(item.name)
return list_name
find03()
for item in find03():
print(item)
# 4. 定义函数,在学生列表中查找成绩最低的学生对象
# 测试,将该学生信息打印在终端中
def find04():
min_stu = list_student[0]
for i in range(1, len(list_student)):
if min_stu.score > list_student[i].score: #逐个比较,若小则换
min_stu = list_student[i]
return min_stu
re = find04()
re.print_self()
# 5. 根据年龄,按照升序将学生列表进行排列.
def sort():
for r in range(len(list_student) - 1):
for c in range(r + 1, len(list_student)):
if list_student[r].age > list_student[c].age:
list_student[r], list_student[c] = list_student[c], list_student[r]
sort()
for item in list_student:
item.print_self()
# 6. 将学生列表中所有男同学删除.
def delete_all():
for i in range(len(list_student) - 1, -1, -1):
if list_student[i].sex == "男":
del list_student[i]
delete_all()
for item in list_student:
item.print_self()