本节主要内容:
面向对象中:
1.类名称空间和对象的名称空间
2.查询顺序
3.计算一个类中有多少实例化对象(含有__init__初始化方法的类)
4.组合
一.类名称空间和对象的名称空间
创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性
而类有两种属性:静态属性和动态属性
- 静态属性就是直接在类中定义的变量
- 动态属性就是定义在类中的方法
其中类的静态属性是共享给所有对象的,而类的动态属性是绑定到所有对象的
创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性
#创建一个Person类class Person: animal = '高级动物' soul = '有灵魂' #类的静态变量/静态字段/静态属性 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): print('工作')Person.__dict__['sleep'](111) #内存地址+()也可以执行方法,相当于Person.sleep(111),,必须要加参数,否则不能打印睡觉p1 = Person('菲律宾','alex','未知',42,175) #实例化一个对象p1# p1.animal = '禽兽' #新增一个对象属性# print(p1.animal) #查看对象的属性值print(Person.name) #通过类查看类的属性
类名称空间和对象名称空间在内存的情况;
创建一个类,程序的执行情况:
二.查询顺序
# 对象.属性 : 先从对象空间找,如果找不到,再从类空间找,再找不到,再从父类找.... # 类名.属性 : 先从本类空间找,如果找不到,再从父类找.... 同一个类中,对象与对象之间是互相独立的.
三.计算一个类中有多少实例化对象(含有__init__初始化方法的类)
1.代码
# 计算一个类 实例化多少对象.class Count: count = 0 def __init__(self): Count.count = self.count + 1obj1 = Count()obj2 = Count()print(Count.count) #2count = 0# 通过类名可以更改我的类中的静态变量值Count.count = 6 #通过类名修改count值print(Count.__dict__)'''{'__module__': '__main__', 'count': 6, '__init__':, '__dict__': , '__weakref__': , '__doc__': None}'''# 但是通过对象 不能改变只能引用类中的静态变量obj1.count = 6 #相当于在对象obj1新增属性,对类中的属性count无法修改.
2.执行过程
四.组合
组合: 给一个类的对象封装一个属性,这个属性是另一个类的对象.
# 组合: 给一个类的对象封装一个属性,这个属性是另一个类的对象.# 版本一:添加武器:斧子,刀,枪,棍,棒...,# 代码不合理: 人物利用武器攻击别人,你的动作发起者是人,而不是武器.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))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('大阳哥',20,500)p2 = GameRole('印度阿宁',50,200)axe = Weapon('三板斧',60)broadsword = Weapon('屠龙宝刀',100)#用武器fightaxe.fight(p1,p2) #大阳哥 用三板斧打了印度阿宁,印度阿宁 掉了60血,还剩140血broadsword.fight(p2,p1) #印度阿宁 用屠龙宝刀打了大阳哥,大阳哥 掉了100血,还剩400血#不用武器attackp1.attack(p2) #大阳哥 攻击 印度阿宁,印度阿宁 掉了20血,还剩120血 # 版本二: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)) def armament_weapon(self,wea): self.wea = weaclass 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('大阳哥',20,500)p2 = GameRole('印度阿宁',50,200)axe = Weapon('三板斧',60)broadsword = Weapon('屠龙宝刀',100)# print(axe) #<__main__.Weapon object at 0x0000009E18C57C88>p1.armament_weapon(axe) # 给大阳哥 装备了三板斧这个对象.# print(p1.wea) #<__main__.Weapon object at 0x00000085E8A57C50># print(p1.wea.name) #三板斧# print(p1.wea.ad) #60p1.wea.fight(p1,p2) #大阳哥 用三板斧打了印度阿宁,印度阿宁 掉了60血,还剩140血