day 23-1 类的命名空间、组合

类的命名空间

类与对象命名空间
  类里 可以定义两种属性
  静态属性
  动态属性

类中的静态变量 可以被对象和类调用
对于不可变数据类型来说,类变量最好用类名操作
对于可变数据类型来说,对象名的修改是共享的,重新赋值是独立的


类里的名字有 类变量(静态属性量)+ 方法名(动态属性)
对象里的名字 对象属性
对象 —— > 类
对象找名字 : 先找自己的 找类的 再找不到就报错
对象修改静态属性的值
对于不可变数据类型来说,类变量最好用类名操作
对于可变数据类型来说,对象名的修改是共享的,重新赋值是独立的

实例化方法共享类变量

#实例化方法共享类变量
class Foo():
    count = 0
    def __init__(self):
        Foo.count += 1

f = Foo()
f2 = Foo()
print(f.count)  #输出结果:2
print(f.count)  #输出结果:2

认识绑定方法
  当对象调用方法的时候,就是把对象里面的值传给了方法,这时就发生了绑定关系

def func():pass
print(func)     # <function func at 0x0000000000731488>

class Foo:
    def func(self):
        print('func')
    def func2(self):
        pass
f1 = Foo()

print(f1)       #<__main__.Foo object at 0x000001F3545E0FD0>
print(Foo.func) #<function Foo.func at 0x00000243F1521AE8>
print(f1.func)  #绑定方法 bound method
print(f1.func2)
#<bound method Foo.func of <__main__.Foo object at 0x00000243F1520FD0>>
#<bound method Foo.func2 of <__main__.Foo object at 0x00000243F1520FD0>>

组合

人狗大战之装备化

#人狗大战之装备化
class Person():
    def __init__(self,name,aggr,hp):
        self.name = name
        self.aggr = aggr
        self.hp = hp
    def bite(self,dog):
        dog.hp -=self.aggr
    def get_weapon(self,weapon):
        self.weapon = weapon
        self.aggr += weapon.aggr

class Weapon:
    def __init__(self,name,aggr):
        self.name = name
        self.aggr = aggr

    #技能
    def hand18(self,dog):
        dog.hp -= self.aggr * 2
        
class Dog():
    def __init__(self,name,aggr,hp):
        self.name = name
        self.aggr = aggr
        self.hp = hp
    def bite(self,person):
        person.hp -=self.aggr

per = Person('鸟人',20,150)
dog = Dog('二哈',50,200)
wuqi = Weapon('打狗棒',50)

#print(dog.__dict__)

#装备打狗棒
#per.get_weapon(wuqi)
#print(per.weapon)
#per.bite(dog)
#print(dog.hp)

#使用技能(组合)
per.jineng = wuqi
per.jineng.hand18(dog)
print(per.jineng.name)
print(per.hp)
print(dog.hp)

组合

  一个类的对象是另外一个类对象的属性(一个对象做了别人的属性就叫组合)
  什么有什么的关系

class A:
    def __init__(self,name):
        self.name = 'ysg'
class B:
    def __init__(self,year,month,day):
        self.year = year
        self.month = month
        self.day = day

b = B(18,1,17)
a = A()
a.birth = b
print(b.year)
print(a.birth.year) 
原文地址:https://www.cnblogs.com/ysging/p/10231239.html