一、面向对象前戏
奥特曼打怪兽
根据我们目前所学的知识一步一步推导
我们都知道奥特曼有名字、性别、技能、变身时间(血量)每个人都不一样 怪兽肯定也是如此了
1.创造出 奥特曼和怪兽(利用所学的数据类型字典较为合适)
Ultraman1 = { # 使用字典模拟奥特曼
'name': 'Tiga',
'gender': 'man',
'ability_dps': 999, # 技能伤害
'blood_volume': 2000 # 血量
}
Monster1 = { # 使用字典模拟
'name': 'Zetton',
'gender': 'man',
'ability_dps': 555, # 技能伤害
'blood_volume': 1499 # 血量
}
'''由于定义奥特曼和怪兽的字典基本不变 但是在很多地方又需要反复使用 所以封装成函数方便简洁'''
2.创建奥特曼怪兽函数
def get_Ultraman(name, gender, ability_dps, blood_volume): # 奥特曼函数 传值即可获得一个奥特曼
Ultraman_obj = {
'name': name,
'gender': gender,
'ability_dps': ability_dps, # 技能伤害
'blood_volume': blood_volume # 血量
}
return Ultraman_obj
def get_Monster(name, gender, ability_dps, blood_volume): # 怪兽函数 传值即可获得一个怪兽
Monster_obj = {
'name': name,
'gender': gender,
'ability_dps': ability_dps, # 技能伤害
'blood_volume': blood_volume # 血量
}
return Monster_obj
U1 = get_Ultraman('Tiga', 'man', 999, 2000) # 随机一个奥特曼
M1 = get_Monster('Zetton', 'man', 555, 1499) # 获得一个怪兽
'''让人和狗具备攻击的能力 本质其实就是定义两个函数供人和狗调用'''
3.定义攻击函数
def Ultraman_attack():
print('即将被攻击的怪兽:%s 当前血量:%s' % (Monster_obj.get('name'), Monster_obj.get('blood_volume'))) # 先展示当前怪兽的状态
Monster_obj['blood_volume'] -= Ultraman_obj.get('ability_dps') # 奥特曼锤怪兽 直接用怪兽的生命值减去奥特曼的技能伤害
print('奥特曼:%s 锤了 怪兽:%s 怪兽掉血:%s 剩余血量:%s' % (Ultraman_obj.get('name'), Monster_obj.get('name'), Ultraman_obj.get('ability_dps'), Monster_obj.get('blood_volume')))
ultraman_attack(U1, M1) # 奥特曼去攻击怪兽
'''奥特曼可以去攻击怪兽 怪兽也可以去攻击奥特曼 此处怪兽攻击省略'''
二、代码优化
4.奥特曼和怪兽的技能乱套
目前奥特曼和怪兽的函数 可以被任意调用
奥特曼可以调用怪兽技能 怪兽可以调用奥特曼的函数
5.奥特曼跟奥特曼攻击怪兽的函数绑定 怪兽跟怪兽攻击奥特曼的函数绑定
我们定义的函数默认情况下都是可以被任意调用的
但是现在我们想实现定义的函数只有特定的东西才可以调用
def get_ultraman(name, gender, ability_dps, blood_volume): # 奥特曼函数 传值即可获得一个奥特曼
def ultraman_attack(ultraman_obj, monster_obj):
print('即将被攻击的怪兽:%s 当前血量:%s' % (monster_obj.get('name'), monster_obj.get('blood_volume'))) # 先展示当前怪兽的状态
monster_obj['blood_volume'] -= ultraman_obj.get('ability_dps') # 奥特曼锤怪兽 直接用怪兽的生命值减去奥特曼的技能伤害
print('奥特曼:%s 锤了 怪兽:%s 怪兽掉血:%s 剩余血量:%s' % (ultraman_obj.get('name'), monster_obj.get('name'), ultraman_obj.get('ability_dps'), monster_obj.get('blood_volume')))
ultraman_obj = {
'name': name,
'gender': gender,
'ability_dps': ability_dps, # 技能伤害
'blood_volume': blood_volume, # 血量
'ultraman_attack': ultraman_attack
}
return ultraman_obj
def get_monster(name, gender, ability_dps, blood_volume): # 怪兽函数 传值即可获得一个怪兽
monster_obj = {
'name': name,
'gender': gender,
'ability_dps': ability_dps, # 技能伤害
'blood_volume': blood_volume # 血量
}
return monster_obj
U1 = get_ultraman('Tiga', 'man', 999, 2000)
M1 = get_monster('Zetton', 'man', 555, 1499)
U1.get('ultraman_attack')(U1, M1)
'''所以这个时候攻击都是奥特曼和怪兽的局部空间函数 所以只能奥特曼调奥特曼 怪兽调怪兽'''
'''怪兽去调奥特曼就是在全局和内置中查找 找不到 所以只能调自己'''
三、总结
将奥特曼的数据和奥特曼的功能(技能)绑定到一起
只有奥特曼可以调到奥特曼的功能
将怪兽的数据和怪兽的功能(技能)绑定到一起
只有怪兽可以调到怪兽的功能
我们将数据与功能绑定到一起的操作起名为:'面向对象编程'
本质:将特定的数据与特定的功能绑定到一起 将来只能彼此相互使用
四、编程思想
面向过程编程
截止之前 我们所编写的代码都是面向过程编程
过程其实就是流程 面向过程编程其实就是在执行一系列的流程
就是按照指定的步骤依次执行 最终就可以得到想要的结果
面向对象编程
核心就是'对象'二字
对象其实就是一个容器 里面将数据和功能绑定到了一起
eg: 游戏人物 ...
只负责创造出该人物以及该人物具备的功能 至于后续战绩如何无人知晓
面向过程编程相当于让你给出一个问题的具体解决方案
面向对象编程相当于让你创造出一些事物之后不用你管
上述两种编程思想没有优劣之分 仅仅是使用场景不同
甚至很多时候是两者混合使用
五、对象与类的概念
对象:数据与功能的结合体
类:多个对象相同的数据和功能的结合体
类比学习法
一个人 对象
多个人 人类
一条狗 对象
多条狗 犬类
类主要用于记录多个对象相同的数据和功能
对象则用于记录多个对象不同的数据和功能
ps:在面向对象编程中 类仅仅是用于节省代码 对象才是核心
六、对象与类的创建
创建类的完整语法
class People:
# 学生对象公共的数据
# 学生对象公共的方法
1.class是定义类的关键字
2.People是类的名字
类名的命名跟变量名一致 并且推荐首字母大写(为了更好的区分)
3.类体代码
公共的数据\公共的方法
ps:类体代码在类定义阶段就会执行!!!
class Student:
school = '清华大学'
def choice_course(self):
print('正在选课')
查看名称空间的方法
print(Student.__dict__) # 使用该方法查看名称空间 可以看成是一个字典
print(Student.__dict__['school']) # 使用字典的取值方式获取名字
print(Student.__dict__.get('choice_course')) # 使用字典的取值方式获取名字
'''在面向对象编程中 想要获取名称空间中的名字 可以采用句点符'''
print(Student.school) # 通过句点符获取名称空间中的名称
print(Student.choice_course) # 通过句点符获取名称空间中的名称
'''类实例化产生对象>>>: 类名加括号'''
stu1 = Student()
stu2 = Student()
print(stu1) # <__main__.Student object at 0x000001D923B04A60>
print(stu2) # <__main__.Student object at 0x0000025E8A48F130>
print(stu1.__dict__, stu2.__dict__) # {} {}
print(stu1.school) # 清华大学
print(stu2.school) # 清华大学
print(stu1.choice_course) # 拿到choice_course的函数名代码体
print(stu2.choice_course) # 拿到choice_course的函数名代码体
Student.school = '北京大学' # 修改school键对应的值
print(stu1.school) # 北京大学
print(stu2.school) # 北京大学
"""
我们习惯将类或者对象句点符后面的东西称为属性名或者方法名
七、对象独有数据
class Student:
school = '清华大学'
def choice_course(self):
print('正在选课')
1.直接利用__dict__方法朝字典添加键值对
obj1 = Student()
obj1.__dict__['name'] = 'LIKE' # 等价于 obj1.name = 'LIKE'
obj1.__dict__['gender'] = 'male' # 等价于 obj1.name = 'male'
print(obj1.name)
print(obj1.gender)
print(obj1.school) # 清华大学
2.将添加独有数据的代码封装成函数
def init(obj,name,age,gender):
obj.__dict__['name'] = name
obj.__dict__['age'] = age
obj.__dict__['gender'] = gender
stu1 = Student()
stu2 = Student()
init(stu1,'jason',18,'male')
init(stu2, 'kevin',28,'female')
'''这个时候stu1,stu2都有自己独立的数据了'''
3.init函数是专用给学生对象创建独有的数据 其他对象不能调用
面向对象思想
将数据和功能整合到一起将函数封装到学生类中 这样只有学生类产生的对象才有资格访问
class Student:
"""
1.先产生一个空对象
2.自动调用类里面的__init__方法 将产生的空对象当成第一个参数传入
3.将产生的对象返回出去
"""
def __init__(self, name, age, gender):
self.name = name # obj.__dict__['name'] = name
self.age = age # obj.__dict__['age'] = age
self.gender = gender # obj.__dict__['gender'] = gender
school = '清华大学'
def choice_course(self):
print('正在选课')
stu1 = Student('jason', 18, 'male')
print(stu1.__dict__)
stu2 = Student('kevin', 28, 'female')
print(stu2.__dict__)
本文仅讲了Python中的面向对象的个人理解,技术小白记录学习过程,有错误或不解的地方请指出,如果这篇文章对你有所帮助请
点赞收藏+关注
谢谢支持!