1.类名称空间,对象名称空间
2.查询顺序
3.组合
1.
类名称空间:定义了一个类之后,会在内存中开辟了一个类名称空间;所有定义类的内容都放在这个空间里.
对象名称空间:实例化对象,就会在内存中新开辟一个对象名称空间,这个对象名称空间一开始就会装有"类对象指针";之后会再陆续添加一些对象的属性.
2.查询顺序:
class A:
name = "老男孩"
job = "IT"
def __init__(self,name,age):
self.name = name
self.age = age
def act(self):
print("我在睡觉")
对象的查询顺序 : 先从对象空间中去找,对象的空间没有此变量或者方法,通过对象中的类对象指针去类中寻找.
obj = A("alex",100)
print(obj.name)
print(obj.age)
print(obj.act)
类的查询顺序 : 直接从类本身去找.
print(A.name)
对象的问题:
无论创建多少对象,都是开辟独立的空间.各个对象之间不能互相查找,干扰.
obj = A("alex",100)
obj1 = A("eva",100")
他们是两个独立的空间,互不干扰.
计算一个类实例化多少对象?
class A:
count = 0
def __init__(self,name,age):
self.name = name
self.age = age
A.count += 1
obj = A("alex",123)
obj = A("taibai",34)
obj = A("jinnvshen",23)
print(A.count)
组合:给一个类的对象,封装一个属性这个属性是另一个类的对象.
我们来看下面的示例:
class Game_role:
def __init__(self,name,ad,hp):
self.name = name
self.ad = ad
self.hp = hp
def attack(self,obj1):
obj1.hp = obj1.hp - self.ad
print("%s攻击%s,%s掉了%s血,还剩%s血" %(self.name,obj1.name,obj1.name.self.ad,obj1.hp))
def package_weapon(self,wea):
self.weapon = wea
class Sword:
def __init__(self,name,ad):
self.name = name
self.ad = ad
def fight(self,p1,p2):
p2.hp = p2.hp - self.ad
print("%s用%s砍了%s一刀,%s还剩%s血"%(p1.name,self.name,p2.name,p2.name,p2.hp)
aduan = Game_role("阿段",10,100)
ts = Game_role("泰森",120,300)
Slaughter_knife = Sword("杀猪刀",200)
有这么一种方式:
Slaughter_knife.fight(aduan,ts)
这么写很别扭,难道是武器让人把自己拿起来砍别人吗?不符合逻辑啊!所以我们要换一种方式.
aduan.package_weapon(Slaughter_knife) #给aduan这个对象封装了一个weapon属性,这个属性值为Slaughter_knife
aduan.weapon.fight(aduan,ts)
ts.attack(aduan)
print(aduan.weapon)
print(aduan.weapon.name)
aduan.weapon.fight(aduan,ts)
上面这个示例展示了组合的用法,仔细捋清晰了!一步一步的来!