面向对象,类的创建,类的方法
面向对象前戏
概要
- 面向对象前戏之人狗大战
- 面向对象编程思想
- 面向对象重要理论
- 面向对象代码实操
- 对象的独有数据
- 对象的独有方法
详细
人狗大战
# 编写代码简单的实现人打狗 狗咬人的小游戏(剧情需要) """推导步骤1:代码定义出人和狗""" person1 = { 'name':'jason', 'age':18, 'gender':'male', 'p_type':'猛男', 'attack_val':5000, 'life_val':900000 } dog1 = { 'name': '小黑', 'd_type': '泰迪', 'attack_val': 100, 'life_val': 8000 } """推导步骤2:将产生人字典和狗字典封装成函数,并封装人和狗的攻击函数""" # def create_person(name, age, gender, p_type, attack_val, life_val): # person_dict = { # 'name': name, # 'age': age, # 'gender': gender, # 'p_type': p_type, # 'attack_val': attack_val, # 'life_val': life_val # } # return person_dict # def create_dog(name, d_type, attack_val, life_val): # dog_dict = { # 'name': name, # 'd_type': d_type, # 'attack_val': attack_val, # 'life_val': life_val # } # return dog_dict # p1 = create_person('jason', 18, 'male', '猛男', 8000, 99999999) # p2 = create_person('kevin', 28, 'female', '淑女', 100, 800) # d1 = create_dog('小黑', '恶霸', 800, 900000) # d2 = create_dog('小白', '泰迪', 100, 800000) # print(p1, p2) # print(d1, d2) # 定义出人打狗的动作 狗咬人的动作 # def person_attack(person_dict, dog_dict): # print(f"人:{person_dict.get('name')}准备揍狗:{dog_dict.get('name')}") # dog_dict['life_val'] -= person_dict.get('attack_val') # print(f"人揍了狗一拳 狗掉血:{person_dict.get('attack_val')} 狗剩余血量:{dog_dict.get('life_val')}") # def dog_attack(dog_dict, person_dict): # print(f"狗:{dog_dict.get('name')}准备咬人:{person_dict.get('name')}") # person_dict['life_val'] -= dog_dict.get('attack_val') # print(f"狗咬了人一口 人掉血:{dog_dict.get('attack_val')} 人剩余血量:{person_dict.get('life_val')}") # person_attack(p1, d1) # dog_attack(d2, p2) """推导步骤3:全局变量都能调用,会产生数据混乱""" # person_attack(d1, p1) # dog_attack(p1, d2)
面向对象核心思路前戏
"""推导步骤4:时间只要人调用人的攻击动作,狗只调用狗的攻击动作》》》数据与方法的绑定""" def get_person(name, age, p_type, attack_val, life_val): def attack(dog_dict): dog_dict['life_val'] -= person_dict.get('attack_val') print(f'人打狗{person_dict.get("attack_val")}血,狗剩余{dog_dict["life_val"]}') person_dict = { 'name': name, 'age': age, 'p_type': p_type, 'attack_val': attack_val, 'life_val': life_val, 'attack': attack } return person_dict def get_dog(name, age, d_type, attack_val, life_val): def attack(person_dict): person_dict['life_val'] -= dog_dict.get('attack_val') print(f'狗咬人{dog_dict.get("attack_val")}血,人剩余{person_dict["life_val"]}') dog_dict = { 'name': name, 'age': age, 'p_type': d_type, 'attack_val': attack_val, 'life_val': life_val, 'attack': attack } return dog_dict p1 = get_person('张三', 18, '猛男', 3000, 99999) d1 = get_dog('黑豹', 5, '护卫犬', 2000, 888888) p1.get('attack')(d1) d1.get('attack')(p1) 面向对象的核心思想:数据与方法的绑定
编程思想
-
面向过程编程
过程即流程 面向过程就是按照固定的流程解决问题
eg:截至ATM为止 使用的几乎都是面向过程编程 注册 登录 转账
需要列举出每一步流程 并且随着步骤的深入 问题的解决越来越简单
ps:提出问题 然后指定出该问题的解决方案
-
面向对象编程
对象 :即容器 数据与方法的结合体(python中一切皆对象)
eg:游戏人物
托儿索,儿童劫,小学僧
面向对象编程优点类似于造物主的感觉 我们只需要造出一个个对象
至于该对象将来会如何发展跟程序员没关系 也无法控制
-
上述两种编程思想没有优劣之分 需要结合实际需求而定
如果需求是注册 登录 人脸识别肯定面向过程更合适
如果需求是游戏人物肯定是面向对象更合适
实际上编程两种思想是相辅相成的 只不过占比可能不同
面向对象之类与对象
对象:数据与功能的结合体 对象才是核心 类:多个对象相同数据与功能的结合体 类主要是为了节省代码 """ 一个人 对象 一群人 人类(所有人相同的特征) 一条狗 对象 一群狗 犬类(所有狗相同的特征) 现实中一般是现有对象再有类 在python中是先有类,再有对象 先定义出类,才能产生类 """
类与对象的创建
面向对象并不是一门新的技术 但是为了很好的一眼区分 针对面向对象设计了新的语法形式 python中一定要有类 才能借助于类产生对象 1.类的语法结构 class 类名: """代码注释""" 对象公共数据 对象公共方法 1.class是定义类的关键字 2.类名的命名与变量名几乎一致 但是需要首字母推荐大写用于区分 3.数据:变量名与数据值的绑定 功能其实激素函数 2.类的定义与调用 类在定义阶段就会执行类体代码 但是属于类的局部命名空间 外界无法调用 # 需求:清华大学学生选课系统 # 定义类 class Student: print('hahahaah') # hahahaah 在定义时就会执行 # 对象公共的数据 school_name = '清华大学' # 对象公共功能 def choice_course(self): print('学生选课') # 查看命名空间 print(Student.__dict__) print(Student.__dict__.get('school_name')) # 清华大学 print(Student.__dict__.get('choice_course')) # <function Student.choice_course at 0x0000020595FC9B80> """在面向对象中 类和对象访问数据或者功能 可以统一采用句点符""" print(Student.school_name) # 清华大学 print(Student.choice_course) # <function Student.choice_course at 0x000001C9EAEE9550> # 类的调用 产生对象 """类名加括号就会产生对象 并且每执行一次都会产生一个全新的对象""" obj1 = Student() # 变量名obj1接收类名加括号之后返回值 obj2 = Student() obj3 = Student() print(obj1, obj2, obj3) # <__main__.Student object at 0x000001614397B130> <__main__.Student object at 0x000001614397B040> <__main__.Student object at 0x000001614397B5E0> print(obj1.__dict__, obj2.__dict__, obj3.__dict__) # {} {} {} # 私有数据方法一个都没有 print(obj1.school_name) # 清华大学 Student.school_name = '野鸡大学' # 修改公共数据 print(obj1.school_name) # 野鸡大学 """数据和功能 也可以统称为属性 数据》属性 功能》方法"""
对象独有数据
''' Author:clever-cat time :2022/11/2-16:38 ''' # class Student: # 对象公共的数据 # school_name = '清华大学' # 对象公共的功能 # def choice_course(self): # print('学生选课功能') # obj1 = Student() # obj2 = Student() # pycharm 并不是特别智能 """推导流程1:每个对象手动添加数据""" # obj1.__dict__['name'] = '张三' # obj1.__dict__['age'] = 18 # print(obj1.name) # 张三 # print(obj1.age) # 18 # 如果有很多就需要填写非常多的代码 # obj2.__dict__['name'] = '李四' # obj2.__dict__['age'] = 8 # print(obj2.name) # 李四 # print(obj2.age) # 8 """推导流程2:封装成函数,减少代码重复性""" # def init(obj, name, age): # obj.__dict__['name'] = name # obj.__dict__['age'] = age # init(obj1, '张三', 20) # init(obj2, '黑豹', 5) # print(obj1.name) # 张三 # print(obj1.age) # 20 # print(obj2.name) # 黑豹 # print(obj2.age) # 5 """推导流程3:全局变量都能调用,不好""" # # class Student: # # 对象公共的数据 # school_name = '清华大学' # # 专门给学生添加独有数据的功能 # def init(obj, name, age): # obj.__dict__['name'] = name # obj.__dict__['age'] = age # # # 对象公共的功能 # def choice_course(self): # print('学生选课功能') # # # obj1 = Student() # obj2 = Student() # # Student.init(obj1, '张三', 18) # Student.init(obj2, '黑豹', 5) # # print(obj1.name) # 张三 # print(obj1.age) # 20 # # print(obj2.name) # 黑豹 # print(obj2.age) # 5 """推导过程4:init方法变形""" class Student: # 对象公共的数据 school_name = '清华大学' # 专门给学生添加独有数据的功能 类产生对象的过程中自动触发 def __init__(self, name, age): self.__dict__['name'] = name self.__dict__['age'] = age # 对象公共的功能 def choice_course(self): print('学生选课功能') obj1 = Student('张三', 18) obj2 = Student('黑豹', 5) print(obj1.name) # 张三 print(obj1.age) # 20 print(obj2.name) # 黑豹 print(obj2.age) # 5 """推导5:变量名的修该""" class Student: # 对象公共的数据 school_name = '清华大学' # 专门给学生添加独有数据的功能 类产生对象的过程中自动触发 def __init__(self, name, age): self.name = name # 等于self.__dict__['name'] = name self.age = age # 等于self.__dict__['age'] = age # 对象公共的功能 def choice_course(self): print('学生选课功能') obj1 = Student('张三', 18) obj2 = Student('黑豹', 5) print(obj1.name) # 张三 print(obj1.age) # 20 print(obj2.name) # 黑豹 print(obj2.age) # 5
对象独有功能
''' Author:clever-cat time :2022/11/2-16:57 ''' class Student: school_name = '清华大学' # 专门给学生添加数据独有功能 类产生对象的过程中自动触发 def __init__(self, name, age): self.name = name self.age = age def chioce_cource(self): print(f'学生{self.name}正在选课') obj1 = Student('张三', 18) obj2 = Student('黑豹', 5) """ 1.直接在全局定义功能 该函数就不是学生对象专属独有的功能了 def eat(): print('吃东西') obj1.eat = eat print(obj1.__dict__) # {'name': '张三', 'age': 18, 'eat': <function eat at 0x000001CFC4F29B80>} obj1.eat() """ # 2.只能将函数放在类中 但是类中的函数有是对象公共的 """定义类中的功能 默认就是绑定给对象使用的 谁来调用谁是主人公,主角""" # Student.chioce_cource(123) # 类调用需要自己传参数 # obj1.chioce_cource() # 对象调用会自动将对象当作第一个参数传入 obj1.chioce_cource() # 学生张三正在选课 obj2.chioce_cource() # 学生黑豹正在选课 # 对象查询数据值 print(obj1.name) # 张三 # 对象修改数据值 obj1.name = '李四' # 当点变量名存在,则修改数据 print(obj1.name) # 李四 # 对象的新政数据值 obj1.gender = 'male' # 当点变量名不存在,则新增数据 print(obj1.gender) # male # 删除数据值 del obj1.gender print(obj1.__dict__) # {'name': '李四', 'age': 18}
本文作者:clever-cat
本文链接:https://www.cnblogs.com/clever-cat/p/16851710.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步