什么是面向对象?
面向对象是一种编程思想。是前辈们总结出的经验,指导程序员如何编写出更好的程序 ,
核心是对象,程序就是一系列对象的集合, 程序员负责调度控制这些对象来交互着完成任务
面向对象的三大优点:
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)