面向对象、类和对象、__dict__方法、__init__方法、对象绑定方法、类绑定方法、对象交互
什么是面向对象?#
面向对象是一种编程思想。是前辈们总结出的经验,指导程序员如何编写出更好的程序 ,
核心是对象,程序就是一系列对象的集合, 程序员负责调度控制这些对象来交互着完成任务
面向对象的三大优点:#
1.扩展性
2.灵活性
3.重用性
缺点:
1.程序的复杂度提高了
面向过程:#
关注的核心是过程,过程是就是一步一步的执行步骤,既先干啥在干啥
优点:逻辑清晰 , 复杂问题简单化,流程化
缺点: 扩展性差,可维护性差
使用场景:#
对扩展性要求较低的程序例如:系统内核,git,计算器
#
既类型,类别 ,是一种抽象概念
是一系列具备相同特征和相同行为的对象的集合
就是具体存在的某个事物,具备自己的特征和行为
对象就是特征和技能的结合体
类和对象关系:#
类包含一系列对象
对象属于某个类
在生活中是先有对象再有类
而在程序中是先有类才能有对象,我们必须先告诉计算机这类的对象有什么特征有什么行为
class 类的名称:
# 类中的内容 描述属性和技能
#描述属性用变量
#描述行为用函数
#类名称 书写规范 首先是见名知意 名称是大驼峰命名法
#驼峰就是单词首字母大写 , 大驼峰是第一个字母大写,小驼峰是第一个字母小写
属性的写法:#
属性可以写在类中
类中的属性,是所有对象公共的
也可以写在对象中
对象中的属性,是每个对象独特的(不一样的)
如果类中和对象中存在同样的属性,先访问对象 如果没有在访问类
例如: 描述一个老师类 需要包含 一个公共属性和 一个独特的属性
class Teacher:
school = "oldboy"
t1 = Teacher()
t1.name = "jack"
t1.age = 28
查看属性 访问的是对象的所有属性
print(对象.__dict__)
访问对象的类信息
print(对象.__class__)
__init__方法:
特点1: 当实例化 对象时,会自动执行init方法
特点2:会自动将对象作为第一个参数传入,参数名称位self ,self可以是别的名字,但不建议改
功能:用户给对象赋初始值
例:
class Dog:
def __init__(self,kind,color,age):
self.kind = kind
self.color = color
self.age = age
d1 = Dog("二哈","黑白",1)
d1 = Dog("泰迪","棕色",2)
注意:该函数不能有任何返回值/.... 只能是None 规定如此..
对象的意义:
将数据和处理数据的函数整合到一起 ,这样一来拿到一个对象就同时拿到了需要处理的数据以及处理数据的函数
对象绑定方法:#
默认情况下类中的方法都是对象绑定方法
其特殊之处在于,当使用对象调用该函数时会自动传入对象本身,作为第一个参数
#
类绑定方法用@classmethod来装饰
特殊之处:不管用类还是对象调用,都会自动传入类本身,作为第一个参数
使用场景:
什么时候绑定给对象:当函数逻辑需要访问对象中的数据时
什么时候绑定给类:当函数逻辑需要访问类中的数据时
非绑定方法:
或叫做静态方法,就是即不需访问类的数据,.也不需要访问对象的数据
语法:@staticmethod
不常用
对象交互练习:

1 import random 2 import time 3 4 5 class Hero: 6 7 def __init__(self,name,level,blood,att,q_hurt,w_hurt,e_hurt): 8 # 简便写法 9 lcs = locals() 10 lcs.pop("self") 11 self.__dict__.update(lcs) 12 13 def attack(self,enemy): 14 enemy.blood -= self.att 15 print("%s对%s释放了普通攻击 造成了%s的伤害 敌人剩余血量%s" % (self.name, enemy.name, self.att, enemy.blood)) 16 if enemy.blood <= 0: 17 print("%s被%s使用普通攻击击杀了" % (enemy.name,self.name)) 18 19 20 def Q(self,enemy): 21 enemy.blood -= self.q_hurt 22 print("%s对%s释放了Q 造成了%s的伤害 敌人剩余血量%s" % (self.name, enemy.name, self.q_hurt, enemy.blood)) 23 if enemy.blood <= 0: 24 print("%s被%s使用Q技能击杀了" % (enemy.name, self.name)) 25 26 def W(self,enemy): 27 enemy.blood -= self.w_hurt 28 print("%s对%s释放了W 造成了%s的伤害 敌人剩余血量%s" % (self.name, enemy.name, self.w_hurt, enemy.blood)) 29 if enemy.blood <= 0: 30 print("%s被%s使用W技能击杀了" % (enemy.name, self.name)) 31 32 def E(self,enemy): 33 enemy.blood -= self.e_hurt 34 print("%s对%s释放了E 造成了%s的伤害 敌人剩余血量%s" % (self.name,enemy.name,self.e_hurt,enemy.blood)) 35 36 if enemy.blood <= 0: 37 print("%s被%s使用E技能击杀了" % (enemy.name, self.name)) 38 39 40 h1 = Hero("亚索",20,2000,100,600,0,1000) 41 h2 = Hero("妲己",20,2000,100,600,500,1000) 42 h3 = Hero("鲁班",20,1500,700,100,200,300) 43 h4 = Hero("蔡文姬",20,2000,10,0,0,10) 44 45 46 # 47 # h1.attack(h2) 48 # h2.Q(h1) 49 # h2.E(h1) 50 # h2.W(h1) 51 52 #从字典中随机拿出一个值 53 54 def random_hero(heros): 55 hero_index = random.randint(1, len(heros)) 56 return heros[hero_index] 57 58 59 while True: 60 # # 把所有的攻击方法装到字典里 为了随机取出一个 61 funcs = {1: Hero.Q, 2: Hero.W, 3: Hero.E, 4: Hero.attack} 62 func_index = random.randint(1, 4) 63 func = funcs[func_index] 64 65 66 # 把所有的英雄方法装到字典里 为了随机取出一个 67 heros = {1: h1, 2: h2, 3: h3, 4: h4} 68 hero = random_hero(heros) 69 70 # 剩余的英雄们 71 other_heros = {} 72 new_index = 1 73 for k, v in heros.items(): 74 if v != hero: 75 other_heros[new_index] = v 76 new_index += 1 77 78 # 从剩余的英雄中随机挑出一个英雄来挨打 79 enemy = random_hero(other_heros) 80 # 打他 81 func(hero, enemy) 82 if enemy.blood <= 0: 83 break 84 time.sleep(0.5)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)