面向对象
类
# 定义一个类
class Cat(): # 类的命名按大驼峰命名规范,即每个单词的首字母大写(语法上并无逻辑要求)
def __init__(self,name,weight): # 初始化,为内建组件,但是我们可以对其参数进行设定
self.name = name # 在此添加的参数是类的对象的初始值,所有在init函数中定义个变量
# 都需要在创建对象时传递对应的值(或者在init中设定默认值,同一般函数类似)
self.weight = weight
def action(self): # self 为类中的通用变量
# 是所有类定义为Cat的对象的一个泛指,谁用他谁就是他
print('会跳,会跑 会抓老鼠')
def food(self):
print('吃小鱼干,吃老鼠')
# 定义为类中的对象
tom = Cat('罗小黑',5) # 类名称括号中的值即为要传递给init的参数
# 然后就能使用类的特性
tom.action() # 因为tom定义为类Cat中的一个对象
# 所以tom具有Cat的性质,可以调用Cat中的参数和方法(函数)
tom.food()
#######################################################
# 简单的参数引用
class Human():
DNA = 23 # 类中的公用参数,无其他赋值的对象使用这一参数均调用这一个数值
def __init__(self,name,age):
self.name = name
self.age = age
def show(self):
# 引用对象参数时,self.参数表示类中给对象使用的参数
print('我的名字是{}\n今年{}岁有{}对DNA'.format(self.name,self.age,Human.DNA))
zs = Human('张三',25)
zs.show()
#################################################################################
__str__方法
class Num():
def __init__(self,name,num):
self.name = name
self.num = num
def __str__(self):
print('wowow')
return '数字是{}是第{}个'.format(self.name,self.num)
num = Num('一',1)
print(num,type(num)) # wowow \n 数字是一是第1个 <class '__main__.Num'>
## 此处打印出了显示为字符串的结果,但是num的类型不是str 而是定义的类Num中的__main__
# 运行的结果中还出现了wowow的输出,表明print语句调用了__str__方法中的所有内容。
# 实际上在对类中的对象进行print时,如果类中有定义__str__方法,print会默认(暗中)调用
###########################################################################################
# 烤肉
class Cook():
def __init__(self,name,time):
self.name = name
self.time = time
self.status = '生的'
def cook(self):
if self.time < 2:
self.status ='生的'
elif self.time < 4:
self.status ='半生的'
elif self.time < 6:
self.status ='熟了'
else:
self.status ='烤焦了'
def __str__(self):
return '{}烤了{}个小时,现在是{}'.format(self.name,self.time,self.status)
yr = Cook('羊肉',4)
yr.cook() # 如果要改变参数(默认初始值),需要调用对应的方法
print(yr) # 羊肉烤了4个小时,现在是熟了
###################################################################################
类属性,对象属性(参数)
1 .不可变类型参数
class A():
key = 10
def __init__(self,num):
self.num = num
def cj(self):
return A.key*self.num
a = A(100)
b = A(23)
print(b.cj()) # 230
print(a.cj()) # 1000
a.key = 3
print(a.cj()) # 300
print(b.cj()) # 230
print(A.key) # 10
A.key = 5
print(a.cj()) # 500
print(b.cj()) # 115
print(A.key) # 5
# 总结: 外部可以更改对象的属性,若对对象的不可变属性更改,
# 不影响类属性,如果更改类属性,将影响全部对象的属性
2,可变类型属性
class A():
list = []
def __init__(self,name):
self.name = name
def l(self):
return self.list
a = A('小a')
b = A('小b')
print(a.l(),id(a.list)) #1794696
print(b.l())
print(A.list)
a.list = [1,2,3]
print(a.l(),id(a.list)) #1794760 发生改变
print(b.l())
print(A.list)
b.list.append('abcd')
print(a.l()) # [1, 2, 3] 由于对a.list重新赋值 ,相当于新建一个a.list供a专用
print(b.l(),id(b.list)) # ['abcd'] 1794696
print(A.list,id(A.list)) # ['abcd'] 1794696由于b在初始值得内存
# 位置做出修改,导致类中整体参数被污染
delattr(a,'list') # 删除a的list属性可以使a重新使用类A的初始值
print(a.l(),id(a.list)) # 1794696
##############################################################################
应用实例
1. 游戏战斗
class Player1():
def __init__(self,name,Hp,attack):
self.name = name
self.Hp = Hp
self.attack = attack
def fight(self,enemy):
self.Hp -= enemy.attack
def __str__(self):
return '{}攻击力{}生命值{}'.format(self.name,self.attack,self.Hp)
class Player2():
def __init__(self,name,Hp,attack):
self.name = name
self.Hp = Hp
self.attack = attack
def fight(self,enemy):
self.Hp -= enemy.attack
def __str__(self):
return '{}攻击力{}剩余生命值{}'.format(self.name,self.attack,self.Hp)
a = Player1('赵云',30,100)
b = Player2('诸葛亮',100,20)
a.fight(b)
b.fight(a)
print(a)
print(b)
##################################################################################
两个类配合使用练习
"""
需求
狙击手 麦克 有一把 狙M99
麦克 可以 开火
狙M99 能够 发射 子弹
狙M99 装填 装填子弹 —— 增加子弹数量
"""
class Shooter():
def __init__(self,name,gun = 'M99'):
self.name = name
self.gun = gun
# self.ammo = ammo
def fire(self,gun,time):
for i in range(time):
gun.fire()
if gun.ammo == 0:
break
print('{}使用{}开火{}次'.format(self.name,gun.name,i+1))
class Guns():
def __init__(self,name,ammo):
self.name = name
self.ammo = ammo
def fire(self,):
if self.ammo>0:
self.ammo -= 1
else:
print('没有子弹了')
def charge(self):
print('填充弹药')
self.ammo = 12
def __str__(self):
return '{}还剩{}颗子弹'.format(self.name,self.ammo)
pe = Shooter('麦克')
gun = Guns('M99',12)
pe.fire(gun,18)
# gun.charge()
print(gun)