python基础入门之面向对象
1|0python基础入门之面向对象
1|1面向对象前戏之人狗大战
"""编写代码简单的实现人打狗,狗咬人的小游戏(剧情需要,人与狗是好朋友)""" #推导步骤1:代码定义出人和狗 person1={ 'name':'jason', 'age':18, 'gender':'male', 'p_type':'猛男', 'attack_val':8000, 'life_val':10000, } person2={ 'name':'lily', 'age':15, 'gender':'female', 'p_type':'小女孩', 'attack_val':5000, 'life_val':8000, } dog1={ 'name':小黑, 'd_type':'泰迪', 'attack_val':8000, 'life_val':9000 } dog2={ 'name':大黄, 'd_type':'金毛', 'attack_val':10000, 'life_val':12000 } """ps:若想定义出多个人和多条狗,上述字典需要反复重复编写""" #推导步骤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,10000) p2=create_person('lily',15,'female','小女孩',5000,8000) d1=create_person('小黑','泰迪',8000,9000) d2=create_person('大黄','金毛',10000,12000) #查看人与狗的数据 print(p1,p2) print(d1,d2) #定义人打狗、狗咬人的动作 #人打狗 def person_attack(person_dict,dog_dict): #人准备打狗 print(f'人:{person_dict.get("name")}准备揍狗:{dog_dict.get{"name"}}') #人:jason准备揍狗:小黑 """狗剩余血量=狗生命值-人攻击力""" dog_dict['life_val']-=person_dict.get('attack_val') print(f'人揍了狗一拳 狗掉血:{person_dict.get("attack_val")} 狗剩余血量:{dog_dict.get{"life_val"}}') #人揍了狗一拳 狗掉血:8000 狗剩余血量:82000 #狗咬人 def dog_attack(dog_dict, person_dict): #狗准备咬人 print(f'狗:{dog_dict.get("name")}准备咬人:{person_dict.get("name")}') #狗:大黄准备咬人:lily """人剩余血量=人生命值-狗攻击力""" person_dict['life_val']-=dog_dict.get('attack_val') print(f"狗要了人一口 人掉血:{dog_dict.get('attack_val')} 人剩余血量:{person_dict.get('life_val')}") #狗要了人一口 人掉血:10000 人剩余血量:70000 person_attack(p1, d1) dog_attack(d2, p2) #推导步骤3:人和狗的攻击混乱""" person_attack(d1, p1) dog_attack(p1, d2) #输出结果: 人:小黑准备揍狗:jason 人揍了狗一拳 狗掉血:8000 狗剩余血量:92000 狗:jason准备咬人:大黄 狗要了人一口 人掉血:8000 人剩余血量:112000
1|2面向对象核心思路前戏
"""推导步骤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 #使用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 #使用dog_attack调用狗的函数 } return dog_dict p1 = get_person('jason', 18, 'male', '猛男', 8000, 10000) d2 = get_dog('大黄', '金毛', 10000, 12000) p1.get('person_attack')(p1, d2)#人攻击狗 #输出结果: 人:jason 准备揍狗:大黄 人揍了狗一拳 狗掉血:8000 狗剩余血量:4000 d2.get('dog_attack')(d2,p1)#狗攻击人 #输出结果: 狗:大黄准备咬人:jason 狗咬了人一口 人掉血:10000 人剩余血量:0 """面向对象核心思想:数据与功能的绑定"""
1|3编程思想
1.面向过程编程 面向过程就是按照固定的流程解决问题 eg:截止ATM为止,使用的几乎都是面向过程编程 注册功能、登录功能、转账功能 """需要列举出每一步流程,并随步骤深入,问题的解决越来越简单 ps:提出问题 然后制定出该问题的解决方案""" 2.面向对象编程 对象即容器,数据与功能的结合体(python中一切皆对象) eg:游戏人物 亚索、劫、盲僧 """面向对象编程类似于造物主,我们只需要造出一个个对象,至于该对象将来会如何发展跟程序员没关系,也无法控制""" """ 上述两种编程思想没有优劣之分,需要结合实际需求而定。 如果需求是注册、登录、人脸识别面向过程更合适,如果需求是游戏人物则面向对象更合适。 实际这两种编程思想是彼此交融的,只不过占比不同。 """
1|4面向对象之类与对象
对象:数据与功能的结合体 #对象才是核心 类:多个对象相同数据和功能的结合体 #类主要就是为了节省代码 """ 一个人 对象 一群人 人类(所有人相同的特征) 一条狗 对象 一群狗 犬类(所有狗相同的特征) """ 现实中一般是先有对象再有类 程序中如果想要产生对象,必须要先定义出类 # 类与对象的创建 面向对象并不是一门新的技术,为了一眼区分,针对面向对象设计了新的语法格式 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.__dict__.get('choice_course')) '''在面向对象中 类和对象访问数据或者功能 可以统一采用句点符''' # print(Student.school_name) # print(Student.choice_course) # 类的调用>>>:产生对象 '''类名加括号就会产生对象 并且每执行一次都会产生一个全新的对象''' obj1 = Student() # 变量名obj1接收类名加括号之后的返回值(结果) obj2 = Student() obj3 = Student() # print(obj1, obj2, obj3) # print(obj1.__dict__) # 对象自己目前什么都没有 # print(obj2.__dict__) # print(obj3.__dict__) 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) '''数据和功能 也可以统称为属性 数据>>>属性名 功能>>>:方法'''
1|5对象的独有数据
class Student: # 对象(stusent)公共的数据 school_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) # print(obj2.__dict__) # obj2.__dict__['name'] = 'kevin' # obj2.__dict__['age'] = 28 # obj2.__dict__['hobby'] = 'music' # print(obj2.__dict__) # print(obj2.name) # print(obj2.age) # print(obj2.hobby) '''推导流程2:将添加对象独有数据的代码封装成函数''' # def init(obj, name, age, hobby): # obj.__dict__['name'] = name # obj.__dict__['age'] = age # obj.__dict__['hobby'] = hobby # stu1 = Student() # stu2 = Student() # init(stu1, 'jason', 18, 'music') # 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.__dict__['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)
1|6对象的独有功能
class Student: # 对象公共的数据 school_name = '清华大学' # 专门给学生添加独有数据的功能 类产生对象的过程中自动触发 def __init__(self, name, age, hobby): self.name = name # self.__dict__['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() # choice_course(stu1) 对象调用会自动将对象当做第一个参数传入 # stu1.choice_course() # stu2.choice_course() # 对象修改数据值 stu1.name = 'tony' # 当点的名字已经存在的情况下 则修改对应的值 # 对象新增数据值 stu1.pwd = 123 # 当点的名字不存在的情况下 则新增数据 print(stu1.__dict__)
__EOF__

本文作者:知了了了了
本文链接:https://www.cnblogs.com/zhiliaowang/p/16852101.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/zhiliaowang/p/16852101.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现