python 面向对象
1.初识面向对象
人狗大战!
def Person(name,sex,hp,ad): #人模板 self = {'name':name,'sex':sex,'hp':hp,'ad':ad} def attack(dog): # 人攻击狗 print('%s攻击%s' % (self['name'], dog['name'])) # 狗掉血 dog['hp'] -= self['ad'] print(dog['hp']) self['attack'] = attack return self #规范了属性个数,简化了创造任务的代码 def Dog(name,kind,hp,ad): #狗模板 self = {'name':name,'sex':kind,'hp':hp,'ad':ad} def bite(person): # 狗攻击人 print('%s攻击%s' % (self['name'],person['name'])) # 人掉血 person['hp'] -= self['ad'] print(person['hp']) if person['hp'] <= 0 :print('game over,%s win'%self['name']) self['bite'] = bite return self #人 Alex = Person('a_sb','不祥',1,5) #狗 chen = Dog('旺财','taidi',50,20) chen['bite'](Alex)
从这个例子中可以看出,两个函数分别代表着不同的阵营,一个人一个狗,这就是最初的类的区别,而当中的攻击和啃咬就类中的方法,也就是技能,也是方法 和动态变量,最初的一直没有改变的self这是静态变量。
类:是一个抽象的范围的统称,包含一组有一定共性的实物。比如:桌子, 书 都是大范围
对象:具有集体描述其功能和属性的事物就是对象,对一个类的具体描述。比如:书桌上面那本红色的书
2.面想对象的好处:
1,使代码能够更具体的描述
2,使代码有更好的拓展性
3,约束了每个对象的专有函数
但是有一大特点:
最终的结果不确定!
class Person: 《--定义一个类名 静态变量 = 123 #静态属性 静态变量 def f1(self):#遵循函数所有的语法,默认带一个参数self #当一个函数落到类里面定义的时候就有了两个名字 方法或着动态属性! print(12342) # d对静态属性来说直接返回值,而动态属性则会执行一段代码,再返回值
print(Person.__dict__) #内置的双下方法 # Person.__dict__['静态变量'] = 2 print(Person.__dict__['静态变量']) print(Person.静态变量) Person.静态变量 = 23333 print(Person.静态变量) del Person.静态变量 print(Person.__dict__)
静态变量调取方法:
1,Person.__dict__[变量名]
2,类名.变量名
动态变量调取方法:
1.类名.函数名 #调取的为函数的地址,返回的是一个地址信息
2.类名.函数名() #调用这个方法并且不许传入一个具体的参数,并且这个参数将会传递给self
创造一个对象:
变量名 = 类名() #直接创建一个对象,并且为对象创建一个单独的内存空间,储存对象的属性(数据)
创建对象的过程也叫做实例化,类产生一个对象的就是实例化。
实例化的过程:
1,创造一个实例,并且 创造一个实参为self。
2,自动运行类中的__init__函数,并且将self传递进去。
3,执行完init后返回self
__init__方法,针对self的方法,给对象添加一些基础属性的方法,一般给self赋值
对象:
1,在类中,对象为self,是本类的一个self
2,在类外,每个对象都有一个专属空间记录着对象的属性。
属性的调用:
1,对象名.属性名
2,对象.__dict__
方法的调用:
1,类名.方法(对象名字)
2,对象名.方法()
3.游戏雏形
class Person: def __init__(self,name,sex,hp,ad): #init 内部不能使用return self.name,self.sex,self.hp,self.ad = name,sex,hp,ad #分别赋值缩写,在__dict__中创建k # self.name = name # self.sex = sex # self.hp = hp # self.ad = ad def attcrt(self,dog): print('%s发动了旋风冲锋,冲撞%s,使得%s受到了%d伤害'% (self.name,dog.name,dog.name,dog.ad)) dog.hp -= self.ad if dog.hp <= 0: print('{}被打败了,{}win'.format(dog.name,self.name)) dog.hp = 0 print(dog.hp)
# def qiyu(self): #利用方法改变对象中的属性 # self.ad += 233 # print('在一个莫名其妙的早上,一个莫名其妙的人给了%s一个莫名其妙的武器,于是%s变强了,伤害增加'%(self.name,self.name)) #self.__dict__['name'] = name class dog: def __init__(self,name,kind,hp,ad): #init 内部不能使用return self.name,self.sex,self.hp,self.ad = name,kind,hp,ad # self.name = name # self.sex = sex # self.hp = hp # self.ad = ad def bite(self,p): #狗的攻击方式 print('%s一个狗撒腿踹到%s的屁股,%s受到了%d伤害'% (self.name,p.name,p.name,self.ad)) p.hp -= self.ad if p.hp <= 0: #判断血量的为0则归零 print('{}被打败了,{}win'.format(p.name,self.name)) p.hp = 0 print(p.hp) alex = Person('渣渣会','不详',50,23) #创造了一个对象, boss_jin = Person('古天乐','公',55,45) cheng = dog('渣渣', '藏獒',66, 233) cheng.bite(alex)
对象的交互,游戏的最初雏形。
在游戏雏形中:
alex.name <--在自己的空间寻找对应名,优先读取自己的空间数据
alex.attack<--在自己的内存空间中寻找,读取到最后就通过类对象指针找到类的id,引用类中的方法
对象的内存空间里:
1,只储存对象属性不会储存方法和静态变量
2,多个有共同属性的对象公用一个类能够节省大量的内存空间。
3,静态变量于方法对相似的对象是共享的
4.对象是独立的!!
对于类的空间来说:
1.方法和静态变量都储存在类空间中
2.对象不能修改类空间中的数据,而类可以修改对象空间中的数据
思考题:
class Person: money = [1] def __init__(self,name): self.name = name def work(self): print(self.name,'工作,赚了1000块钱') self.money[0] += 1000 father = Person('father') mother = Person('mother') mother.work() father.work() print(Person.money) # 2000 or 0?
请务必注意:对象调取的方法和属性到底是怎么调用的??
思考题2:
class Person: money = [0] def __init__(self,name): self.name = name def work(self): print(self.name,'工作,赚了1000块钱') Person.money = [Person.money[0] + 1000] father = Person('father') mother = Person('mother') mother.work() father.work() print(Person.money)
注意:同样是对象的调取问题,还有关于他的空间问题!!
4.类的组合
当一个大类需要一个小类中的方法时,将小类变成大类的一个属性,就是类的组合,也就是一个类的对象作为另一个类的属性
还是利用人狗大战来举例子:
人和狗的血量和伤害差距过大,想要弥补的话试着增加装备,而装备应该也是一个类,是一个需要被引用的类,因此调用这个类,并且将具体的武器作为这个类的对象,而人这个大类将武器作为他的一个属性之一,每次引用武器属性的时候就可以引用武器类的所有方法,从而使得人可以装备各种武器。
class Animaer: #创建一个父类 由于 def __init__(self,name,sex,hp,ad): self.name = name self.sex = sex self.hp = hp self.ad = ad self.money = 0 class Person(Animaer): #引用父级 def attack(self,dog): print('%s 使用普通攻击,%s 受到%s 的伤害' % (self.name, dog.name, self.ad)) dog.hp -= self.hp def pay(self): k = int(input('请输入你要充值的金额:')) self.money += k print('你的余额有%s' % self.money) def Wear(self,wearpon): if self.money >= wearpon.price: self.wq = wearpon #装备武器 self.money -= wearpon.price print('装备完毕') print(self.__dict__) else: print('余额不足,请充值') def attack_wear_skill(self, dog): if 'wq' in self.__dict__: self.wq.skill_(dog) else: print('请先装备武器') class Dog: def __init__(self,name,sex,hp,ad): self.name = name self.sex = sex self.hp = hp self.ad = ad def bite(self,person): print('%s使用要要攻击,%s受到了%s的伤害' % (self.name,person.name,self.ad)) person.hp -= self.ad class Wearpon: def __init__(self,name,skill,ad,price): self.name = name self.ad = ad self.skill = skill self.price = price def skill_(self,dog): print('发动技能{}进攻{},{}受到{}的伤害,'.format(self.skill,dog.name,dog.name,self.ad)) alex = Person('积极','攻',200,10) cheng = Dog('呵呵','母',100, 5) print(cheng.name) futou = Wearpon('开山斧','劈山',50,100) while True: li = ['普通攻击','充值','购买武器','发动技能'] for v,k in enumerate(li,1): print(v,k) change = int(input('请输入选择》》')) if change == 1: alex.attack(cheng) elif change == 2: alex.pay() elif change == 3: alex.Wear(futou) elif change == 4: alex.attack_wear_skill(cheng) else: print('输入错误')