面向对象 组合

回顾:类命名空间与对象,实例的命名空间

  类的属性:静态属性和动态属性(方法)

    静态属性就是直接在类中定义的变量

    动态属性(方法):就是定义在类中的方法(函数)

  注意:类的属性是共享给所以的对象的,而类的动态属性是绑定到所有对象的

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

  在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]

只要对象的某个属性被直接赋值,那么一定是对象的命名空间发生了变化

所以结论:只要是静态变量,就直接用类名进行操作

 

posted @ 2018-08-28 15:51  云丛  阅读(119)  评论(0编辑  收藏  举报