创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性
创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性
查询顺序:
对象.属性 : 先从对象空间找,如果找不到,再从类空间找,再找不到,再从父类找....
class Person: animal = "高级动物" soup = "有灵魂" language = "语言" def __init__(self, country, name, sex, age, hight): self.country = country self.name = name self.sex = sex self.age = age self.hight = hight def eat(self): print("%s在吃饭" % self.name) def sleep(self): print("睡觉") def work(self): pass p1=Person("美国","武大","男",35,160) print(p1.name) print(p1.animal) print(p1.sleep()) 武大 高级动物 睡觉 None
类名.属性 : 先从本类空间找,如果找不到,再从父类找....
class Person: animal = "高级动物" soup = "有灵魂" language = "语言" def __init__(self, country, name, sex, age, hight): self.country = country self.name = name self.sex = sex self.age = age self.hight = hight def eat(self): print("%s在吃饭" % self.name) def sleep(self): print("睡觉") def work(self): pass print(Person.animal) 结果:高级动物 Person.__dict__["sleep"](11) 结果:睡觉 print(Person.name) 结果:报错
对象与对象之间是互相独立的.
计算一个类 实例化多少对象.
class Count: count=0 def __init__(self): Count.count=self.count+1 ret=Count() ret1=Count() ret2=Count() print(Count.count) 结果:3
通过类名可以更改我的类中的静态变量值
class Count: count=0 def __init__(self): pass Count.count=6 print(Count.__dict__) {'__module__': '__main__', 'count': 6, '__init__': <function Count.__init__ at 0x0000022D460C8D90>,
'__dict__': <attribute '__dict__' of 'Count' objects>, '__weakref__': <attribute '__weakref__' of 'Count' objects>, '__doc__': None}
但是通过对象 不能改变只能引用类中的静态变量
class Count: count=0 def __init__(self): pass ret=Count() print(ret.count) ret.count=6 结果:0
组合:
3,模拟英雄联盟写一个游戏人物的类.
要求:
(1)创建一个 Game_role的类.
(2) 构造方法中给对象封装name,ad(攻击力),hp(血量).三个属性.
(3) 创建一个attack方法,此方法是实例化两个对象,互相攻击的功能:
例: 实例化一个对象 盖伦,ad为20, hp为500
实例化另个一个对象 剑豪 ad为50, hp为200
盖伦通过attack方法攻击剑豪,此方法要完成 '谁攻击谁,谁掉了多少血, 还剩多少血'的提示功能.
class GameRole: def __init__(self, name, ad, hp): self.name = name self.ad = ad self.hp = hp def attack(self,p): p.hp = p.hp - self.ad print('%s 攻击 %s,%s 掉了%s血,还剩%s血' %(self.name,p.name,p.name,self.ad,p.hp)) p1 = GameRole('盖伦',20,500) p2 = GameRole('亚索',50,200) p1.attack(p2) print(p2.hp) 盖伦 攻击 亚索,亚索 掉了20血,还剩180血 180
组合: 给一个类的对象封装一个属性,这个属性是另一个类的对象.
版本一:
class GameRole: def __init__(self, name, ad, hp): self.name = name self.ad = ad self.hp = hp class Weapon: 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滴血,还剩下%s滴血" % (p1.name,self.name,p2.name,p2.name, self.ad,p2.hp)) p1=GameRole("剑姬",100,1000) p2=GameRole("诺手",80,1200) axe=Weapon("诺克萨斯斧",60) sword=Weapon("无双剑",80) sword.fight(p1,p2) axe.fight(p2,p1) 剑姬用无双剑打了诺手,诺手掉了80滴血,还剩下1120滴血 诺手用诺克萨斯斧打了剑姬,剑姬掉了60滴血,还剩下940滴血
版本二:
def __init__(self, name, ad, hp): self.name = name self.ad = ad self.hp = hp def weapon(self,obj): self.obj=obj class Weapon: 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滴血,还剩下%s滴血" % (p1.name,self.name,p2.name,p2.name, self.ad,p2.hp)) p1=GameRole("剑姬",100,1000) p2=GameRole("诺手",80,1200) axe=Weapon("诺克萨斯斧",60) sword=Weapon("无双剑",80) p1.weapon(sword) # 给P1装备了一件武器 p2.weapon(axe) # 给p2装备了一件武器 p1.obj.fight(p1,p2) p2.obj.fight(p2,p1) 剑姬用无双剑打了诺手,诺手掉了80滴血,还剩下1120滴血 诺手用诺克萨斯斧打了剑姬,剑姬掉了60滴血,还剩下940滴血