19 面向对象初识2
一.类的名称空间
1.对象的名称空间
对象的名称空间中有类对象指针,对象可以通过"类对象指针"找类中的"静态变量"(静态字段),也可以用对象找类中的"方法名"(函数).
2.类的查询顺序
对象的查询顺序,先找"对象空间",如果没有,通过对象中"类对象指针"找"类名称空间"
3.对象的问题
无论创建多少对象都是开辟独立的空间,各个对象之间不能互相查找,干扰.
二.计算一个类实例化多少个对象
class Person:
level="高级动物"
mind="有思想"
stand="直立行走"
count=0 # 设置一个计数变量
def __init__(self,name,age):
Person.count=Person.count+1 # 设置一个计数器
self.name=name
self.age=age
def eat(self):
print("吃吃的爱")
aQ=Person("阿Q",30)
aP=Person("阿啤",26)
aF=Person('阿凡',27)
print(aQ.count) # 3
三.组合
1.定义
给一个类的对象封装一个属性,这个属性是一个类的对象.
2.模拟英雄联盟写一个游戏人物的类. (加武器)
要求:
(1)创建一个 Game_role的类.
(2) 构造方法中给对象封装name,ad(攻击力),hp(血量).三个属性.
(3) 创建一个attack方法,此方法是实例化两个对象,互相攻击的功能:
例: 实例化一个对象 盖伦,ad为10, hp为100
实例化另个一个对象 剑豪 ad为20, hp为80
盖伦通过attack方法攻击剑豪,此方法要完成 '谁攻击谁,谁掉了多少血, 还剩多少血'的提示功能.
class Game_role: #第一个类
def __init__(self,name,ad,hp):
self.name=name
self.ad=ad
self.hp=hp
def attack(self,other):
other.hp=other.hp-self.ad #剩余血量
print("%s攻击%s,%s掉了%s血,还剩%s血" %(self.name,other.name,other.name,self.ad,other.hp ))
def package_weapon(self,wea):
self.weapon = wea #给对象增加weapon属性
class Sword: #第二个类
def __init__(self,name,ad):
self.name=name
self.ad=ad
def fight(self,other1,other2):
other2.hp=other2.hp-double_edged.ad #剩余血量
print("%s用%s攻击%s,%s掉了%s血,还剩%s血" %(hero1.name,self.name,hero2.name,hero2.name,double_edged.ad,other2.hp))
hero1=Game_role("盖伦",100,500) #第一个类 实例化的第一个对象
hero2=Game_role("剑豪",250,800) #第一个类 实例化的第二个对象
double_edged=Sword("宝剑",400) #第二个类 实例化的第一个对象
hero1.package_weapon(double_edged) #对象执行package_weapon方法给对象增加weapon属性
hero1.weapon.fight(hero1,hero2) #hero1.weapon对象查找对象的weapon属性 weapon的值为"double_edged"
double_edged是Sword类实例化的一个对象,对象执行fight方法需要传两个参数