面向对象思想
面向对象编程思想前戏#
人狗大战小游戏#
描述人和狗
方式1:使用一个字典一个个描述#
dog1 = {
'name': '小黑',
'type': '田园犬',
'attack_val': 30,
'life_val': 200
}
dog2 = {
'name': '小白',
'type': '恶霸犬',
'attack_val': 180,
'life_val': 500
}
person1 = {
'name': '小龙',
'type': '猛男',
'attack_val': 10,
'life_val': 1000
}
方式2:封装成函数 减少代码冗余#
def get_person(name, gender, age, t_type, attack_val, life_val):
data = {
'name': name,
'gender': gender,
'age': age,
't_type': t_type,
'attack_val': attack_val,
'life_val': life_val
}
return data
def get_dog(name, t_type, attack_val, life_val):
data = {
'name': name,
't_type': t_type,
'attack_val': attack_val, # 攻击
'life_val': life_val # 生命值
}
return data
p1 = get_person('tuzi', 'male', '20', '开挂的猛男', 666, 1500)
d1 = get_dog('泡面(狗名)', '中华田园犬', 100, 600)
思考如何做到人和狗只能调用属于自己的攻击动作#
其实就是想让人的数据跟人的功能绑定 狗的数据跟狗的功能绑定
def get_person(name, gender, age, t_type, attack_val, life_val):
# 将人的攻击动作放在产生人的函数内
def person_attack(person_obj, dog_obj):
"""
:param person_obj: 接收一个人
:param dog_obj: 接收一条狗
"""
print('当前狗的血量是:%s' % dog_obj['life_val'])
dog_obj['life_val'] -= person_obj['attack_val']
print(f"人{person_obj['name']}打了狗{dog_obj['name']}一下,剩余血量{dog_obj['life_val']}")
data_dict = {
'name': name,
'gender': gender,
'age': age,
't_type': t_type,
'attack_val': attack_val,
'life_val': life_val,
'person_attack':person_attack
}
return data_dict
def get_dog(name, t_type, attack_val, life_val):
# 将狗的攻击动作放在产生人的函数内
def dog_attack(dog_obj, person_obj):
"""
:param dog_obj: 接收一条狗
:param person_obj: 接收一个人
"""
# 使用最简答的掉血逻辑 血量减去对方攻击力
print('当前狗的血量是:%s' % dog_obj['life_val'])
dog_obj['life_val'] -= person_obj['attack_val']
print(f"人{person_obj['name']}打了狗{dog_obj['name']}一下,剩余血量{dog_obj['life_val']}")
data_dict = {
'name': name,
't_type': t_type,
'attack_val': attack_val,
'life_val': life_val,
'dog_attack':dog_attack
}
return data_dict
p1 = get_person('jason','male',18,'猛男',800, 1000)
d1 = get_dog('泡面(狗名)', '中华田园犬', 100, 600)
p1['person_attack'](p1,d1)
# 上述操作就是把数据和对应的功能绑定在一起了,不再是所有的数据都可以调用任意的功能了
# 上述讲数据与功能整合到一起的操作其实就是面向对象编程的思想
编程思想#
面向过程编程#
将程序的执行流程化,即分步操作,分步的过程中解决问题
eg:注册、登录、结算购物车...
"""注册:第一步获取用户名 第二步比对用户名数据 ..."""
"""结算:第一步获取购物车数据 第二步计算钱数 ..."""
过程可以理解成是流水线 面向过程编程可以理解成是在创建一条流水线
面向对象编程#
'对象'就是面向对象编程的核心
对象其实就是一个'容器'将数据与功能整合到一起,只要是符合上述描述的事物都可以称之为是对象
eg:
人狗大战最后的函数内部有数据和功能,可以称之为面向对象编程
模块文件内部含有数据和功能,也可以称之为面向对象编程
'''细想一下,python中一切皆为对象'''
python针对面向编程提供了专门的语法,识别度更高,编写更精简
eg:人、动物、游戏角色
"""
面向过程与面向对象两者没有优劣之分 具体要结合实际情况
甚至很多时候两者是混合在一起的!!! 思想占据的比例不同而已
"""
类与对象的概念#
什么是类与对象#
对象:数据与功能的结合体
类:即类别、种类、相当于诸多对象公有的特征(数据、功能)
'''
在现实生活中
人 对象
一群人 人类
狗 对象
一群狗 犬类
上述的人类、犬类就是用来描述多个对象'相同'特征的名词
人分为黄种人、黑种人、白种人,都属于人类,但是彼此也有不同的特征
类只能描述公共的特征,不同的特征应该由对象自己描述
'''
🐖:类其实也算对象>>>:一切皆对象
类与对象的创建#
定义类#
'''
在代码编程中是现有类才能有对象
'''
# 定义类
# 学生类
class Student:
school = '清华大学'
def choise_course(self):
print('学生选课功能')
'''类体代码无序调用就会执行,产生类的名称空间'''
'''
语法结构
class 类名:
类体代码
1.class 是定义类的关键字
2.类名类似于函数名,但是首字母推荐大写,用于区分
3.类体代码就是存放对象公共数据和功能的地方
数据:变量名 = 变量值
功能:函数
'''
语法结构#
class 类名:
类体代码
1.class 是定义类的关键字
2.类名类似于函数名,但是首字母推荐大写,用于区分
3.类体代码就是存放对象公共数据和功能的地方
数据:变量名 = 变量值
功能:函数
'''
查看名称空间的方法:__dict__
#
# 查看名称空间的方法>>>>:__dict__
# print(Student.__dict__) # 返回值是一个字典
# print(Student.__dict__['school']) # 获取类中的属性
# 清华大学
# print(Student.__dict__['choise_course']) # 获取类中的属性
# <function Student.choise_course at 0x000002CDFFC4CA60>
'''类获取数据和功能有一个简便的方式>>>>:句点符'''
# print(Student.school)
# 清华大学
# print(Student.choise_course)
# <function Student.choise_course at 0x000002CDFFC4CA60>
如何产生对象:类名加括号#
'''如何产生对象:类名加括号'''
obj1 = Student() # 类名加括号就是在产生一个对象
obj2 = Student() # 类名加括号就是在产生一个对象
print(obj1.__dict__,obj2.__dict__) # {} {}
print(obj1.school) # 清华大学
print(obj2.school) # 清华大学
print(obj1.choise_course) # <bound method Student.choise_course of <__main__.Student object at 0x00000266787F7438>>
print(obj2.choise_course) # <bound method Student.choise_course of <__main__.Student object at 0x00000266787F7470>>
Student.school = '北京大学' # Student.__dict__['school'] = '北京大学' 修改名字与值的对应关系
print(obj1.school) # 北京大学
print(obj2.school) # 北京大学
对象的实例化#
class Student:
# 方案三函数
# def set_info(self,name,age,gender):
# """该方法就一个功能>>>:给对象添加独有的数据"""
# self.name = name # self.__dict__['name'] = name
# self.age = age # self.__dict__['age'] = age
# self.gender = gender # self.__dict__['gender'] = gender
# 方案四函数
def __init__(self,name,age,gender):
"""该方法就一个功能>>>:给对象添加独有的数据"""
self.name = name # self.__dict__['name'] = name
self.age = age # self.__dict__['age'] = age
self.gender = gender # self.__dict__['gender'] = gender
# 学生类公共的数据
school = '清华大学'
# 学生类公共的功能
def choose_coures(self):
print('学生选课功能')
# obj1 = Student() # 目前对象没有自己独有的属性
# print(obj1.__dict__) # 大白话就是给字典添加键值对
'''方案1:逐步给对象添加独有的数据'''
# obj1.__dict__['name'] = 'tuzi'
# obj1.__dict__['age'] = 18
# obj1.__dict__['gender'] = 'male'
# print(obj1.__dict__) # {'name': 'tuzi', 'age': 18, 'gender': 'male'}
# print(obj1.name) # tuzi
'''方案2:将冗余的添加步骤封装成函数'''
# def init(obj,name,age,gender):
# obj.name = name # obj.__dict__['name'] = name
# obj.age = age # obj.__dict__['age'] = age
# obj.gender = gender # obj.__dict__['gender'] = gender
# init(obj1,'tuzi',18,'male')
# print(obj1.name) # tuzi
'''方案3:简单的封装成函数没有提现出面向对象整合的精髓>>>:讲函数写到类中去'''
# obj1 = Student()
# Student.set_info(obj1,'jason',18,'male')
# print(obj1.name) # jason
'''方案4:类中针对给对象创建,独有数据的函数名,专门定义了一个固定的方法'''
obj1 = Student('tuzi',18,'male')
print(obj1.__dict__) # {'name': 'tuzi', 'age': 18, 'gender': 'male'}
__init__
与self#
类中的__init__方法会在类产生对象的时候执行
类产生对象的具体步骤
1.先创建一个没有独有数据的空对象{}
2.将空对象和类括号内传入的数据一般交给__init__执行
__init__的第一参数就是对象本身
__init__(obj,name,age,gender)
obj 就是对象的本身
3.将创建好的对象自动返回
给你提供这种方式能够减少代码的编写
# self说明
针对括号内第一个形参self其实就是一个普通的变量名而已
只不过该变量名将来专门接收对象的,所以给他起了个固定的名字叫self
绑定方法#
在类中定义的函数默认都是绑定给对象使用的,即对象来调 会自动将对象当做第一个参数传入
class Student:
school = '清华大学'
def __init__(self,name,age):
self.name = name
self.age = age
def func(self):
print(f'{self.name}正在调用func方法')
def index(self):
print(f'{self.name}正在调用index方法')
#
obj1 = Student('jason',18)
# print(obj1)
obj2 = Student('kevin',28)
# print(obj2)
obj1.func() # jason正在调用func方法
obj2.func() # kevin正在调用func方法
print(obj1.func) # <bound method Student.func
print(obj2.func) # <bound method Student.func
'''所以应该能理解为什么类中所有的函数第一个参数都是self'''
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?