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('输入错误')