面向对象
实例介绍(人狗大战)
people1 = {
'name' : 'su',
'age' : 22,
'Power value' : 800,
'blood_flow' : 8000,
'weapon' : 'Lavinia arrow'
}
people2 = {
'name' : 'princess',
'age' : 22,
'Power value' : 900,
'blood_flow' : 8888,
'weapon' : 'excalibur'
}
。。。。。。
def person(name, age, Power_value, blood_flow, weapon):
people = {
'name': name,
'age': age,
'Power_value': Power_value,
'blood_flow': blood_flow,
'weapon': weapon
}
return people
people1 = person('su', 22, 800, 8000, 'Lavinia arrow')
people2 = person('princess', 22, 900, 8888, 'excalibur')
------------
dog1 = {
'name' : '哮天犬',
'age' : 1,
'Power value' : 200,
'blood_flow' : 6000,
'weapon' : 'tooth'
}
dog2 = {
'name' : '藏獒',
'age' : 2,
'Power value' : 800,
'blood_flow' : 6000,
'weapon' : 'dog paw '
}
。。。。。
创建狗的数据 创建多个的话每一次代码都是重复的 所以包装成函数便于调用
def dogs(name, age, Power_value, blood_flow, weapon):
dog = {
'name': name,
'age': age,
'Power_value': Power_value,
'blood_flow': blood_flow,
'weapon': weapon
}
return dog
dog1 = dogs('哮天犬',1,200,6000,'tooth')
dog2 = dogs('藏獒',2,800,6000, 'dog paw ')
def person_attack(person, dogs):
print('即将被攻击的狗:%s 当前血量:%s' % (dogs.get('name'), dogs.get('blood_flow')))
dogs['blood_flow'] -= person.get('Power_value')
print('人:%s 用武器:%s 射了 狗:%s 狗掉血:%s 剩余血量:%s' % (
person.get('name'),person.get('weapon'), dogs.get('name'), person.get('Power_value'), dogs.get('blood_flow')))
def dog(dogs, person):
print('即将被攻击的人:%s 当前血量:%s' % (person.get('name'), person.get('blood_flow')))
person['blood_flow'] -= dogs.get('Power_value')
print('狗:%s 用武器:%s 挠了 人:%s 人掉血:%s 剩余血量:%s' % (
dogs.get('name'),dogs.get('weapon') ,person.get('name'), dogs.get('Power_value'), person.get('blood_flow')))
res1 = person_attack(people2, dog2)
res2 = dog(dog1, people1)
打印结果是:
即将被攻击的狗:藏獒 当前血量:6000
人:princess 用武器:excalibur 射了 狗:藏獒 狗掉血:900 剩余血量:5100
即将被攻击的人:su 当前血量:8000
狗:哮天犬 用武器:tooth 挠了 人:su 人掉血:200 剩余血量:7800
人狗大战优化版
res1 = dog(people2, dog2)
res2 = person_attack(dog1, people1)
即将被攻击的人:藏獒 当前血量:6000
狗:princess 用武器:excalibur 挠了 人:藏獒 人掉血:900 剩余血量:5100
即将被攻击的狗:su 当前血量:8000
人:哮天犬 用武器:tooth 射了 狗:su 狗掉血:200 剩余血量:7800
------------
def person(name, age, Power_value, blood_flow, weapon):
def person_attack(person, dogs):
print('即将被攻击的狗:%s 当前血量:%s' % (dogs.get('name'), dogs.get('blood_flow')))
dogs['blood_flow'] -= person.get('Power_value')
print('人:%s 用武器:%s 射了 狗:%s 狗掉血:%s 剩余血量:%s' % (
person.get('name'), person.get('weapon'), dogs.get('name'), person.get('Power_value'),
dogs.get('blood_flow')))
people = {
'name': name,
'age': age,
'Power_value': Power_value,
'blood_flow': blood_flow,
'weapon': weapon ,
'person_attack' : person_attack
}
return people
people1 = person('su', 22, 800, 8000, 'Lavinia arrow')
people2 = person('princess', 22, 900, 8888, 'excalibur')
def dogs(name, age, Power_value, blood_flow, weapon):
def dog(dogs, person):
print('即将被攻击的人:%s 当前血量:%s' % (person.get('name'), person.get('blood_flow')))
person['blood_flow'] -= dogs.get('Power_value')
print('狗:%s 用武器:%s 挠了 人:%s 人掉血:%s 剩余血量:%s' % (
dogs.get('name'), dogs.get('weapon'), person.get('name'), dogs.get('Power_value'),
person.get('blood_flow')))
dog = {
'name': name,
'age': age,
'Power_value': Power_value,
'blood_flow': blood_flow,
'weapon': weapon,
'dog' : dog
}
return dog
dog1 = dogs('哮天犬', 1, 200, 6000, 'tooth')
dog2 = dogs('藏獒', 2, 800, 6000, 'dog paw ')
people2['person_attack'](people2,dog2)
总结
1.将人的数据与人的功能绑定在一起,只有人能调用
2.将狗的数据与狗的功能绑定在一起 ,只有狗能调用
编程思想
面向过程
例如:我们写的一些校验代码之类的
第一步先是获取用户输入
第二步比对用户名密码
第三步写入文件
等等。。。
过程可以理解成是流水线 面向过程编程可以理解成是在创建一条流水线

面向对象
例如:上面我们写的模拟人狗大战的小游戏,这类游戏人物,王者荣耀里的英雄一样,我们只是创造出来了他,让他有了功能和数据的结合, 但是最终他在玩家手里输出产生不同的结果。
对象与类的概念
对象的概念
就是用于记录多个不同的数据与功能的结合体
类的概念
用于记录多个相同的数据与功能结合体
但是!每个对象可以有自己的独特数据与功能
在面向对象编程中 类仅仅是用于节省代码 对象才是核心
类与对象的创建
类的定义
也就是说,我们要先定义类,才能产生对象
class people :
school = '新东方'
def message(self):
people1 = {
'name' : 'princess',
'age' : 22,
'Power value' : 900,
'blood_flow' : 8888,
'weapon' : 'excalibur'}
return people1
(就是底下产生的对象都可以用的数据)
与函数体不同的是 :
类查看名称空间的方法
print(people.__dict__)
{'__module__': '__main__', 'school': '新东方', 'message': <function people.message at 0x000002089065C0D0>, '__dict__': <attribute '__dict__' of 'people' objects>, '__weakref__': <attribute '__weakref__' of 'people' objects>, '__doc__': None}
print(people.__dict__.get('school'))
print(people.__dict__['message'])
------------
********可以采用句点符.的方式查看空间名称*********
print(people.school)
print(people.message)
对象的实例化
res = people()
res2 = people()
print(res)
print(res2)
------------
print(res.school)
print(res2.school)
people.school = '清华大学'
print(res.school)
print(res2.school)
对象的绑定方法
对象的独有数据
res.__dict__['name'] = 'summer'
print(res.name)
------------
res.age = 18
print(res.age)
------------
def func(name, age, Power_value, blood_flow, weapon):
res.__dict__['name'] = name
res.__dict__['age'] = age
res.__dict__['Power_value'] = Power_value
res.__dict__['blood_flow'] = blood_flow
res.__dict__['weapon'] = weapon
res = people()
func('su', 22, 800, 8000, 'Lavinia arrow')
print(res.__dict__)
将对象独有数据整合
方法1:
class people :
def func(name, age, Power_value, blood_flow, weapon):
res.__dict__['name'] = name
res.__dict__['age'] = age
res.__dict__['Power_value'] = Power_value
res.__dict__['blood_flow'] = blood_flow
res.__dict__['weapon'] = weapon
school = '新东方'
def message(self):
print('123')
方法2
class people :
def func(res,name, age, Power_value, blood_flow):
res.name = name
res.age = age
res.Power_value = Power_value
res.blood_flow = blood_flow
school = '新东方'
def message(self):
print('123')
res = people()
print(res.__dict__)
people.func(res,'princess', 22, 900, 8888)
print(res.__dict__)
方法3
1.先产生一个空对象
2.自动调用__init__方法 ,将产生的空对象当第一个参数传进去
3.第一个参数有一个名称self,如果写的是self的话,会自动默认将空对象当作第一个参数传进去 ,表示当前被执行的对象
第一个参数的值会随着调用的对象产生改变
class people :
def __init__(self,name, age, Power_value, blood_flow):
self.name = name
self.age = age
self.Power_value = Power_value
self.blood_flow = blood_flow
school = '新东方'
def message(self):
print('123')
res = people('princess', 22, 900, 8888)
print(res.__dict__)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现