一面向对象初识:
除了面向对象,还有个面向过程,那什么是面向过程呢?
面向过程:
面向过程是一种编程思想,就是将代码流程化了,其核心就是过程,就是解决问题的步骤,即先做什么再做什么。
优点:将复杂的问题流程化了,简单化
缺点:扩展性低,复用性低,维护性低
面向对象:
它也是一种编程思想,其核心就是对象二字,不再纠结其过程,设计对象去获取想要的。
优点:扩展性高,复用性高,维护性高
缺点:解决问题的复杂度较高
应用场景:面向对象应该应用于直接面向客户的,要求灵活性高的比如qq,微信,
而面向过程应该应用于不经常更改的,比如linux的内核
类与对象:
对象:就是具备某种行为和特征的结合体,是确切存在的
类:就是一系列具有相同特征和行为的对象的结合体,是一种抽象的存在
在生活中是先有对象再有类,而在编程中是先有类在有对象。
在类中特征也就是可以说是属性,行为就是函数
类名必须要起到见名知意,而且采用大驼峰写法,首字母大写
例子:
class Person:
pass
创建对象
p = Person()
print(p) # <__main__.Person object at 0x10b11d588>
对象的属性操作
要为其增加属性可以在创建对象后,使用点语法变量名加.
p.name = 'lw'
print(p.name) # 获取同样是点语法
对象的查找顺序
先找对象自身,然后再找对象所在的类。
print(对象.__dict__)访问的当前对象的所有属性
print(对象.__class__)访问的当前对象所在类信息
__init__初始化方法:
这个是一个初始化方法,本质上就是一个函数。
其特点有:
1.它会类实例化产生对象时自动执行
2.并会将对象作为第一个参数自动传入
3.该函数没有返回值
功能:就是给对象赋予初始值
class Dog: def __init__(self,kind,color,age): self.kind = kind self.color = color self.age = age d1 = Dog("二哈","黑白",1) d1 = Dog("泰迪","棕色",2)
对象的精髓就是将数据和处理数据的函数整合到一起,这样对象既能拿到需要处理的数据又能拿到处理数据的函数
绑定方法:
绑定方法也可以称为绑定函数
绑定方法里面分为:
对象绑定方法:
特点:1.会在对象调用该函数时,自动将对象作为第一个参数传入
2.使用类名来调用时就是一个普通函数,有几个参数就要传入几个参数
类绑定方法:
@classmethod
会在对象调用该函数时,自动将类当作第一个参数传入
非绑定方法
@staticmethod
既不需要对象中 的数据也不需要类中的数据,只是一个普通函数
类的例子:
import random import time class Hero: def __init__(self,name,level,blood,att,q_hurt,w_hurt,e_hurt): # 简便写法 lcs = locals() lcs.pop("self") self.__dict__.update(lcs) def attack(self,enemy): enemy.blood -= self.att print("%s对%s释放了普通攻击 造成了%s的伤害 敌人剩余血量%s" % (self.name, enemy.name, self.att, enemy.blood)) if enemy.blood <= 0: print("%s被%s使用普通攻击击杀了" % (enemy.name,self.name)) def Q(self,enemy): enemy.blood -= self.q_hurt print("%s对%s释放了Q 造成了%s的伤害 敌人剩余血量%s" % (self.name, enemy.name, self.q_hurt, enemy.blood)) if enemy.blood <= 0: print("%s被%s使用Q技能击杀了" % (enemy.name, self.name)) def W(self,enemy): enemy.blood -= self.w_hurt print("%s对%s释放了W 造成了%s的伤害 敌人剩余血量%s" % (self.name, enemy.name, self.w_hurt, enemy.blood)) if enemy.blood <= 0: print("%s被%s使用W技能击杀了" % (enemy.name, self.name)) def E(self,enemy): enemy.blood -= self.e_hurt print("%s对%s释放了E 造成了%s的伤害 敌人剩余血量%s" % (self.name,enemy.name,self.e_hurt,enemy.blood)) if enemy.blood <= 0: print("%s被%s使用E技能击杀了" % (enemy.name, self.name)) h1 = Hero("亚索",20,2000,100,600,0,1000) h2 = Hero("妲己",20,2000,100,600,500,1000) h3 = Hero("鲁班",20,1500,700,100,200,300) h4 = Hero("蔡文姬",20,2000,10,0,0,10) # # h1.attack(h2) # h2.Q(h1) # h2.E(h1) # h2.W(h1) #从字典中随机拿出一个值 def random_hero(heros): hero_index = random.randint(1, len(heros)) return heros[hero_index] while True: # # 把所有的攻击方法装到字典里 为了随机取出一个 funcs = {1: Hero.Q, 2: Hero.W, 3: Hero.E, 4: Hero.attack} func_index = random.randint(1, 4) func = funcs[func_index] # 把所有的英雄方法装到字典里 为了随机取出一个 heros = {1: h1, 2: h2, 3: h3, 4: h4} hero = random_hero(heros) # 剩余的英雄们 other_heros = {} new_index = 1 for k, v in heros.items(): if v != hero: other_heros[new_index] = v new_index += 1 # 从剩余的英雄中随机挑出一个英雄来挨打 enemy = random_hero(other_heros) # 打他 func(hero, enemy) if enemy.blood <= 0: break time.sleep(0.5)