面向对象 组合
回顾:类命名空间与对象,实例的命名空间
类的属性:静态属性和动态属性(方法)
静态属性就是直接在类中定义的变量
动态属性(方法):就是定义在类中的方法(函数)
注意:类的属性是共享给所以的对象的,而类的动态属性是绑定到所有对象的
创建一个对象/实例就会创建一个对象/实例的就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性
在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常
面向对象的组合用法
软件重要的方式:组合 继承
组合指的是,指一个类的对象作为另一个类对象的属性。使俩个类之间产生关系
经典例题:
# class Foo: # count = 0 # def __init__(self): # self.count += 1 # f1 = Foo() # f2 = Foo() # print(Foo.count) # 0 类的方法调用 # print(f1.count) # 1 对象f1对类方法调用 # print(f2.count) #1 对象f2 对类方法的调用 #这是俩个不同的对象所以,调用的结果都是为1
例:请你写一个类,能够统计一共实例化了多少个对象?
class Foo: count = 0 def __init__(self): Foo.count += 1 #生成一个对象就会是将类(Foo)的属性+1 f1 = Foo() print(f1.count) #1 f2 = Foo() f3= Foo() print(f1.count) #3 print(f3.count) #3
当类中属性发生改变的时候,对象中没有同名的属性。方法的时候,对象使用的属性名会跟着类中的变量走
class Foo: count = [0] f1 = Foo() f1.count[0]+= 1 print(f1.count[0]) #1 print(Foo.count) #[1] f1.count = [2] #这部操作是给f1这个对象空间中增加属性。 print(Foo.count) #[1]
只要对象的某个属性被直接赋值,那么一定是对象的命名空间发生了变化
所以结论:只要是静态变量,就直接用类名进行操作