面向对象编程
2022/4/7 9:19:05
本文主要是介绍面向对象编程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前戏
人狗大战小游戏
# 人狗大战小游戏 # 1.描述人和狗 '''描述人和狗的方式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_dict = { # 'name': name, # 'gender': gender, # 'age': age, # 't_type': t_type, # 'attack_val': attack_val, # 'life_val': life_val # } # return data_dict # def get_dog(name, t_type, attack_val, life_val): # data_dict = { # 'name': name, # 't_type': t_type, # 'attack_val': attack_val, # 'life_val': life_val # } # return data_dict # p1 = get_person('jason', 'male', 18, '猛男', 800, 1000) # p2 = get_person('kevin', 'female', 28, '淑女', 5, 100) # dog1 = get_dog('小黑', '松狮犬', 300, 500) # dog2 = get_dog('小白', '泰迪犬', 50, 200) # def dog_attack(dog_obj, person_obj): # """ # :param dog_obj: 接收一条狗 # :param person_obj: 接收一个人 # """ # # 使用最简答的掉血逻辑 血量减去对方攻击力 # print('当前人的血量是:%s' % person_obj.get('life_val')) # person_obj['life_val'] -= dog_obj.get('attack_val') # print("""狗:%s 咬了人:%s 一口 人掉血:%s 剩余血量:%s"""%(dog_obj.get('name'),person_obj.get('name'),dog_obj.get('attack_val'),person_obj['life_val'])) # def person_attack(person_obj, dog_obj): # """ # :param person_obj: 接收一个人 # :param dog_obj: 接收一条狗 # """ # print('当前狗的血量是:%s'%dog_obj.get('life_val')) # dog_obj['life_val'] -= person_obj.get('attack_val') # print("""人:%s 锤了狗:%s 一下 狗掉血:%s 剩余血量:%s"""%(person_obj.get('name'),dog_obj.get('name'),person_obj.get('attack_val'),dog_obj['life_val'])) # 狗咬人 # dog_attack(dog2,p1) # print(p1) # 人锤狗 # person_attack(p2, dog1) # print(dog1) '''人调用了狗的攻击动作''' # dog_attack(p1, dog1) '''狗调用了人的攻击工作''' # person_attack(dog2,p2) """如何做到只有人可以调用人的攻击动作 狗调用狗的攻击动作""" # 其实就是想让人的数据跟人的功能绑定 狗的数据跟狗的功能绑定 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.get('life_val')) dog_obj['life_val'] -= person_obj.get('attack_val') print("""人:%s 锤了狗:%s 一下 狗掉血:%s 剩余血量:%s""" % ( person_obj.get('name'), dog_obj.get('name'), person_obj.get('attack_val'), 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' % person_obj.get('life_val')) person_obj['life_val'] -= dog_obj.get('attack_val') print("""狗:%s 咬了人:%s 一口 人掉血:%s 剩余血量:%s""" % ( dog_obj.get('name'), person_obj.get('name'), dog_obj.get('attack_val'), person_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) p2 = get_person('kevin','female',28,'淑女',10,100) dog1 = get_dog('小黑', '松狮犬', 300, 500) dog2 = get_dog('小白', '泰迪犬', 50, 200) p1['person_attack'](p1,dog1) dog1['dog_attack'](dog1,p2) """ 上述操作其实就是将数据与功能进行绑定 不再是所有的数据都可以调用任意的功能 """ # 上述将数据与功能整合到一起的操作其实就是 面向对象编程的思想
编程思想
1.面向过程编程
核心在于'过程' 将程序的执行流程化 即分布操作 先做什么然后再做什么 ''' 注册: 1.输入用户名 2.输入密码 3.将用户名与数据库的的用户名做对比判断是否已存在 4.不存在则新建并保存数据 ... 结算购物车: 1.获取购物车数据 2.统计购物车的总价 3.将总价与现有余额对比 4.余额够实现扣费 ... ''' '过程'好比是流水线 要有一个先后顺序 需要先完成上一步才能开始下一步 面向过程编程可以看作是创建在一条流水线上
2.面向对象编程
核心在于'对象' 对象其实就是一个"容器" 将数据与功能整合到一起 只要是符合上述描述的事物都可以称之为是对象 ''' 人狗大战中最后的函数内部含有数据和功能 可以称之为面向对象编程 模块文件内部含有数据和功能 也可以称之为面向对象编程 python中一切皆对象 '''
类与对象的概念
对象:数据与功能的结合体 类:即类别、种类 相当于诸多对象公有的特征(数据、功能) ''' 现实生活中 人 是 对象 一群人 是 人类 狗 是 对象 一群狗 是 狗类 类只能描述公共的特征 依据参照物不同 如人与狗对比 人类则存有 对象 人 共有的部分 狗类则为狗共有的 而人有不同的姓名 性别 分不同肤色 黄 黑 白 就需要由对象自己去描述 ''' ps:类其实也算对象>>>:一切皆对象
类与对象的创建
""" 在代码编程中是先有类才能有对象 """ # 先定义类 后产生对象 # 学生类 class Student: school = '清华' """类体代码无需调用就会执行 产生类的名称空间""" # print(school) # 无需调用 运行py就执行输出 def choose_course(self): print('选课') """类体代码无需调用就会执行 产生类的名称空间""" """ 语法结构 class 类名: 类体代码 1.class是定义类的关键字 2.类名类似于函数名 但是首字母推荐大写 用于区分 3.类体代码就是存放对象公共数据和功能的地方 数据: 变量名 = 变量值 功能: 函数 """ # 查看名称空间的方法>>>:__dict__ # print(Student.__dict__) # 返回值是一个字典 {'__module__': '__main__', 'school': '清华', 'choose_course': <function Student.choose_course at 0x00000221FF0463A0>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None} # print(Student.__dict__['school']) # 获取类中的属性 清华 # print(Student.__dict__['choose_course']) # 获取类中的属性 <function Student.choose_course at 0x00000216E9CE63A0> """类获取数据和功能有一个简便的方式>>>:句点符""" print(Student.school) # 清华 print(Student.choose_course) # <function Student.choose_course at 0x000002032CA263A0> """如何产生对象:类名加括号""" obj1 = Student() # 类名加括号就是在产生一个对象 obj2 = Student() # print(obj1.__dict__, obj2.__dict__) # {} {} # print(obj1.school) # 清华 # print(obj2.school) # 清华 # print(obj1.choose_course) # bound method # print(obj2.choose_course) print(obj1.school) # 清华 print(obj2.school) # 清华 Student.school = '北大' # Student.__dict__['school'] = '北大' 修改名字与值的对应关系 print(Student.school) # 修改后为北大 print(obj1.school) # 北大 print(obj2.school) # 北大
对象的实例化
class Card: # 共同的数据 card_type = 'monster card' # 共同的功能 def card_attack(self): print('攻击表示') def card_defense(self): print('防御表示') obj11 = Card() # 目前对象没有自己独有的属性 obj22 = Card() # 目前对象没有自己独有的属性 print(obj11.__dict__) # {} print(obj22.__dict__) # {}
'''方案1:逐步给对象添加独有的数据''' print(obj11.__dict__) print(obj22.__dict__) obj11.__dict__['name'] = '青眼白龙' obj11.__dict__['level'] = 8 obj11.__dict__['attrivute'] = '光' obj22.__dict__['name'] = '黑魔导' obj22.__dict__['level'] = 7 obj22.__dict__['attrivute'] = '闇' print(obj11.__dict__,obj22.__dict__) # {'name': '青眼白龙', 'level': 8, 'attrivute': '光'} {'name': '黑魔导', 'level': 7, 'attrivute': '闇'} print(obj11.name, obj22.name) # 青眼白龙 黑魔导
class Card: # 共同的数据 card_type = 'monster card' # 共同的功能 def card_attack(self): print('攻击表示') def card_defense(self): print('防御表示') '''方案2:将冗余的添加步骤封装成函数''' def init(obj, name, level, attribute): obj.name = name obj.level = level obj.attribute = attribute obj1 = Card() obj2 = Card() init(obj1, '青眼白龙', 8, '光') init(obj2, '黑魔导', 7, '闇') print(obj1.name) print(obj2.name, obj2.level)
'''方案3:简单的封装成函数没有提现出面向对象整合的精髓>>>:将函数写到类中去''' class Card: def init(self, name, level, attribute): self.name = name # 卡名 self.level = level # 等级 self.attribute = attribute # 属性 # 共同的数据 card_type = 'monster card' # 共同的功能 def card_attack(self): print('攻击表示') def card_defense(self): print('防御表示') obj1 = Card() obj2 = Card() Card.init(obj1,'青眼白龙', '8', '光') Card.init(obj2,'黑魔导', '7', '闇') print(obj1.name) print(obj2.name, obj2.level)
'''方案4:类中针对给对象创建独有数据的函数名 专门定义了一个固定的方法''' class Card: def __init__(self, name, level, attribute, attack, defense): '''该方法就一个功能>>>:给对象添加独有的数据''' self.name = name # 卡名 self.level = level # 等级 self.attribute = attribute # 属性 self.attack = attack # 攻击力 self.defense = defense # 防御力 # 共同的数据 card_type = 'monster card' # 共同的功能 def card_attack(self): print('攻击表示') def card_defense(self): print('防御表示') obj1 = Card('青眼白龙', '8', '光', 3000, 2500) obj2 = Card('黑魔导', '7', '闇', 2500, 2100) print(obj1.__dict__) # {'name': '青眼白龙', 'level': '8', 'attribute': '光', 'attack': 3000, 'defense': 2500} print(obj2.__dict__) # {'name': '黑魔导', 'level': '7', 'attribute': '闇', 'attack': 2500, 'defense': 2100} """ 类中的__init__方法会在类产生对象的时候自动执行 类产生对象的具体步骤 1.先创建一个没有独有数据的空对象 {} 2.将空对象和类括号内传入的数据一并交给__init__执行 __init__的第一个参数就是对象本身 __init__(obj,name,age,gender) 3.将创建好的对象自动返回 给你提供这种方式能够减少代码的编写 ps:针对括号内第一个形参self其实就是一个普通的变量名而已 只不过该变量名将来专门接收对象的 所以给它起了个固定的名字叫self """
绑定方法
""" 在类中定义的函数默认都是绑定给对象使用的 即对象来调 会自动将对象当做第一个参数传入 """ class Card: def __init__(self, name, level, attribute, attack, defense): '''该方法就一个功能>>>:给对象添加独有的数据''' self.name = name # 卡名 self.level = level # 等级 self.attribute = attribute # 属性 self.attack = attack # 攻击力 self.defense = defense # 防御力 # 共同的数据 card_type = 'monster card' # 共同的功能 def card_attack(self): print('攻击表示') def card_defense(self): print('防御表示') # 类调用类中函数 有几个参数就需要传几个参数 Card.card_attack(1) '''card_attack() 必须要传一个参 此处任意传参不影响输出''' # 对象调用类中函数 会将当前调用的对象当做第一个参数自动传入 obj1 = Card('青眼白龙', '8', '光', 3000, 2500) '''def __init__(self, name, level, attribute, attack, defense): 这里看似 self, name, level, attribute, attack, defense 6个参数 实际第一个self参数会将当前的对象自动传入 即自动将obj1传给self ''' # obj1.card_attack() # 攻击表示
这篇关于面向对象编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)