(1)创建一个类就会产生一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性
(2)创建一个对象就会创建一个对象的名称空间,存放着对象的名字,也就是对象的属性
当通过对象名.属性名查找属性的时候,会先去对象自己的名称空间中找属性,找不到则去类中找,类也找不到就去父类...最后找不到抛出异常
class Person
{ def __init__(self,name,live_value,weapon,agg):
self.name=name
self.live_value=live_value
self.weapon=weapon
self.agg=agg
def attack(self,obj):
obj.live_value-=self.agg
def fun():
print("读者大大最帅")
}
[
p=Person('tony',1000,'金箍棒')
]
用花括号括起来的这一部分就叫做类的名称空间。
用中括号括起来的这一部分就叫做对象的名称空间。
(这里面的花括号和中括号都是我加的,实际写代码中不要写,写着是为了方便理解。)
在一个类中以另一个类的对象作为属性存在,称为类的组合使用。
众所周知,前面我们将类比作了一个盒子,但是正如百年孤独里所说的
“遭受百年孤独的家族,注定不会在大地上第二次出现了”
那么
遭受百年孤独的盒子,注定不会再大陆上第二次出现了
所以我们玩对象那是不是可以玩花一点。我的对象能不能从两个类里面提取属性,三个类呢?四个呢?
所以类的组合使用作用就是让对象能够从不同类里面提取元素使用,比如在王者荣耀中,我英雄有基本的普攻等技能了,但是我发现现在伤害不够,那我是不是可以通过买装备的方式来进行属性上的提升,那么买的装备又属于另一个类了。
下面我们先进行代码演示
class Weapon:
def __init__(self,name,agg,money):
self.name=name
self.agg=agg
self.money=money
def baoji(self,obj):
obj.life_value-=500
class Person:
def __init__(self,name,agg,life_value,speed_per_second,money,weapon1)
self.name=name#名字
self.agg=agg#攻击力
self.life_value=life_value#生命值
self.speed_per_second=speed_per_second#移速
self.money=money#金币
self.weapon1=Wepon(agg)
def attack(self,obj):
#普通攻击的方式
obj.live_value-=self.agg
p=Person('扁鹊',10,10000,50)
p1=Person('貂蝉',15,10000,40)
weapon=Weapon('回响之杖',20,100)
#这里我们定义三个对象,貂蝉和扁鹊对打
查看貂蝉扁鹊的血量
print(p.life_value)
print(p1.life_value)
#扁鹊攻击貂蝉方式
p.attack(p1)
#貂蝉攻击扁鹊方式
p1.attcak(p)
查看貂蝉扁鹊的血量
print(p.live_value)
print(p1.live_value)
#这个时候我扁鹊发现打不过貂蝉我要买个回响之杖。
#这里我们就不把它封装起来了,实际上在游戏中的装备应该都是一个封装或者多个封装函数拼接起来的
if p.money>weapon.money:
p.wuqi=weapon
#定义出来了一个p的武器(就相当于定义了一个对象其实本质上他就是weapon只不过我们把他的名字变了,这样我们等下就可以通过p.wuqi的名字使用weapon里面的属性了。)
p.money-=weapon.money
#将原本的金币减去买武器用的钱,这里其实和p.wuqi无关了。只不过我们买了一个独立的武器要消耗钱,把p对象的金钱减一减而已
p.agg+=weapon.agg
#将回响之杖的攻击和扁鹊原本的攻击相加造出一个带回响之杖的扁鹊因为买了装备了所以给扁鹊加个攻击力。
p.wuqi.baoji(p1) # 扁鹊使用武器暴击貂蝉,会发现这里其实本质上就是weapon.baoji(p1),用p.wuqi这个名字也是为了满足见名知意的条件 print(p1.life_value) # 查看貂蝉的生命值