面向对象(类名称空间,查询顺序,组合)

创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性

创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性

查询顺序:
对象.属性 : 先从对象空间找,如果找不到,再从类空间找,再找不到,再从父类找....
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
View Code

组合: 给一个类的对象封装一个属性,这个属性是另一个类的对象.
版本一:
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滴血
View Code

  版本二:

    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滴血
 
 
 


 
原文地址:https://www.cnblogs.com/chenyibai/p/9360293.html