python -- 类名称空间及查询顺序/组合

主要内容:

面向对象中:

  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 + 1

obj1 = Count()
obj2 = Count()

print(Count.count)  #2
count = 0

# 通过类名可以更改我的类中的静态变量值
Count.count = 6   #通过类名修改count值
print(Count.__dict__)
'''{'__module__': '__main__', 'count': 6, '__init__': <function Count.__init__ at 0x0000009D9F958A60>
 , '__dict__': <attribute '__dict__' of 'Count' objects>, '__weakref__': <attribute '__weakref__' of 'Count' objects>
 , '__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)
#用武器fight
axe.fight(p1,p2)   #大阳哥 用三板斧打了印度阿宁,印度阿宁 掉了60血,还剩140血
broadsword.fight(p2,p1)     #印度阿宁 用屠龙宝刀打了大阳哥,大阳哥 掉了100血,还剩400血
#不用武器attack
p1.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 = wea 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) # 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) #60 p1.wea.fight(p1,p2) #大阳哥 用三板斧打了印度阿宁,印度阿宁 掉了60血,还剩140血

posted @ 2018-07-24 17:48  我叫好名字  阅读(182)  评论(0编辑  收藏  举报