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)