人狗大战
| |
| """推导步骤1:代码定义出人和狗""" |
| person1 = { |
| 'name': 'jason', |
| 'age': 18, |
| 'gender': 'male', |
| 'p_type': '猛男', |
| 'attack_val': 8000, |
| 'life_val': 99999999 |
| } |
| person2 = { |
| 'name': 'kevin', |
| 'age': 28, |
| 'gender': 'female', |
| 'p_type': '淑女', |
| 'attack_val': 1, |
| 'life_val': 100 |
| } |
| dog1 = { |
| 'name': '小黑', |
| 'd_type': '泰迪', |
| 'attack_val': 100, |
| 'life_val': 8000 |
| } |
| dog2 = { |
| 'name': '小白', |
| 'd_type': '恶霸', |
| 'attack_val': 2, |
| 'life_val': 80000 |
| } |
| |
| """推导步骤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('jack', 20, 'male', '防御型', 500, 7000) |
| p2 = create_person('kevin', 28, 'female', '辅助', 100, 8000) |
| d1 = create_dog('小黑', '恶霸', 800, 900000) |
| d2 = create_dog('小白', '泰迪', 100, 800000) |
| |
| |
| 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, gender, p_type, attack_val, life_val): |
| |
| 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')}") |
| |
| person_dict = { |
| 'name': name, |
| 'age': age, |
| 'gender': gender, |
| 'p_type': p_type, |
| 'attack_val': attack_val, |
| 'life_val': life_val, |
| 'person_attack': person_attack |
| } |
| return person_dict |
| |
| |
| def get_dog(name, d_type, attack_val, 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')}") |
| dog_dict = { |
| 'name': name, |
| 'd_type': d_type, |
| 'attack_val': attack_val, |
| 'life_val': life_val, |
| 'dog_attack': dog_attack |
| } |
| return dog_dict |
| |
| person1 = get_person('jason', 18, 'male', '猛男', 8000, 99999999) |
| dog1 = get_dog('小黑', '恶霸', 800, 900000) |
| person1.get('person_attack')(person1, dog1) |
| |
| 面向对象核心思想:数据与功能的绑定 |
编程思想
| 1.面向过程编程 |
| 过程即流程 面向过程就是按照固定的流程结局问题 |
| '''截至atm为止 使用的几乎都是面向过程编程''' |
| 注册功能 登录功能 转账功能 |
| 需要列举每一步的流程 并且随着步骤的深入 问题结局的越来越方便 |
| |
| |
| 2.面向过程编程 |
| 对象即是容器 数据与功能的结合体(python中一切皆对象) |
| ex: 游戏任务 亚索 劫 盲僧 后羿 |
| |
| |
| |
| """ |
| 上述两种编程思想没有优劣之分 需要结合实际需求而定 |
| 如果需求是注册 登录 人脸识别肯定面向过程更合适 |
| 如果需求是游戏人物肯定是面向对象更合适 |
| 实际编程两种思想是彼此交融的 只不过占比不同 |
| """ |
| |
面向对象之类与函数
| 对象:数据与功能的结合体 |
| 类: 多个对象相同数据和功能的结合体 |
| 主要就是为了节省代码 |
| """ |
| 一个人 对象 |
| 一群人 人类(所有人相同的特征) |
| |
| 一条狗 对象 |
| 一群狗 犬类(所有狗相同的特征) |
| |
| """ |
| |
| 现实中一般是先有对象再有类 |
| 程序中如果想要产生对象 必须要先定义出类 |
# 类与对象的创建
| """ |
| 面向对象并不是一门新的技术 但是为了很好的一眼区分开 针对面向对象设计了新的语法格式 |
| python中一定要有类 才能借助于类产生对象 |
| """ |
| |
| 1.类的语法结构 |
| class 类名: |
| """代码注释""" |
| 对象公共的数据 |
| 对象公共的功能 |
| 1.class是定义类的关键字 |
| 2.类名的命名与变量名几乎一致 需要注意的时候首字母推荐用大写用于区分 |
| 3.数据:变量名与数据值的绑定 功能(方法) |
| 其实就是函数 |
| 2.类的定义与调用 |
| 类在定义阶段就会执行类体代码 但是属于类的局部名称空间 外界无法直接调用 |
| |
需求:清华大学学生选课系统

| class Student: |
| |
| school_name = '清华大学' |
| |
| def choice_course(self): |
| print('学生选课功能') |
| |
| print(Student.__dict__) |
| print(Student.__dict__.get('school_name')) |
| '''在面向对象中 类和对象访问数据或者功能 可以统一采用句点符''' |
| print(Student.school_name) |
| |
| print(Student.choice_course) |
| |
| '''类名加括号就会产生对象 并且每执行一次都会产生一个全新的对象''' |
| |
| obj1 = Student() |
| obj2 = Student() |
| obj3 = Student() |
| |
| |
| |
| |
| print(obj1.school_name) |
| print(obj2.school_name) |
| print(obj3.school_name) |
| Student.school_name = '家里蹲大学' |
| print(obj1.school_name) |
| print(obj2.school_name) |
| print(obj3.school_name) |
| '''数据和功能 也可以统称为属性 数据>>>属性名 功能>>>:方法''' |
对象独有的数据
| class Student: |
| |
| shcool_name = '清华大学' |
| |
| |
| def choice_course(self): |
| print('学生选课功能') |
| |
| obj1 = Student() |
| obj2 = Student() |
| '''推导流程1:每个对象手动添加独有的数据''' |
| print(obj1.__dict__) |
| obj1.__dict__['name'] = 'jason' |
| obj1.__dict__['age'] = 18 |
| obj1.__dict__['hobby'] = 'study' |
| print(obj1.__dict__) |
| |
| print(obj1.name) |
| print(obj1.age |
| print(obj1.hobby) |
| |
| obj2.__dict__['name'] = 'kevin' |
| obj2.__dict__['age'] = 28 |
| obj2.__dict__['hobby'] = 'music' |
| print(obj2.__dict__) |
| |
| '''推导流程2:将添加对象独有数据的代码封装成函数''' |
| |
| def init(obj, name, age, hobby): |
| obj.__dict__['name'] = name |
| obj.__dict__['age'] = 22 |
| obj.__dict__['hobby'] = hobby |
| |
| - |
| stu1 = Student() |
| stu2 = Student() |
| init(stu1, 'wei', 18, 'ball') |
| init(stu2, 'kevin', 29, 'read') |
| print(stu1.__dict__) |
| print(stu2.__dict__) |
| |
| '''推导流程3:给学生对象添加独有数据的函数只有学生对象有资格调用''' |
| class Student: |
| |
| school_name = '清华大学' |
| |
| |
| def init(obj, name, age, hobby): |
| obj.__dict__['name'] = name |
| obj.__dict__['age'] = age |
| obj.__dict__['hobby'] = hobby |
| |
| |
| def choice_course(self): |
| print('学生选课功能') |
| |
| |
| stu1 = Student() |
| Student.init(stu1, 'jason', 18, 'music') |
| stu2 = Student() |
| Student.init(stu2, 'kevin', 29, 'read') |
| print(stu1.__dict__, stu2.__dict__) |
| |
| '''推导步骤4:init方法变形''' |
| class Student: |
| |
| school_name = '清华大学' |
| |
| |
| def __init__(obj, name, age, hobby): |
| obj.__dict__['name'] = name |
| obj.__dict__['age'] = age |
| obj.__dict__['hobby'] = hobby |
| |
| |
| def choice_course(self): |
| print('学生选课功能') |
| |
| stu1 = Student('jason', 18, 'read') |
| print(stu1.__dict__) |
| print(stu1.name) |
| print(stu1.school_name) |
| '''推导步骤5:变量名修改''' |
| class Student: |
| |
| school_name = '清华大学' |
| |
| |
| def __init__(self, name, age, hobby): |
| self.name = name |
| self.age = age |
| self.hobby = hobby |
| |
| |
| def choice_course(self): |
| print('学生选课功能') |
| |
| stu1 = Student('jason', 18, 'read') |
| print(stu1.name) |
| print(stu1.school_name) |
对象独有的功能
| class Student: |
| |
| school_name = '清华大学' |
| |
| def __init__(self, name, age, hobby): |
| self.name = name |
| self.age = age |
| self.hobby = hobby |
| |
| |
| def choice_course(self): |
| print(f'学生{self.name}正在选课') |
| |
| stu1 = Student('jason', 18, 'music') |
| stu2 = Student('kevin', 28, 'read') |
| |
| 1.直接在全局定义功能 该函数就不是学生对象独有的了 |
| def eat(): |
| print('吃东西') |
| stu1.eat = eat |
| print(stu1.__dict__) |
| stu1.eat() |
| 2.只能将函数放在类中 但是类中的函数又是对象公共的 |
| '''定义在类中的功能 默认就是绑定给对象使用的 谁来调谁就是主人公''' |
| Student.choice_course(123) |
| stu1.choice_course() |
| |
| |
| |
| |
| |
| stu1.name = 'tony' |
| |
| stu1.pwd = 123 |
| print(stu1.__dict__) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构