一 组合的相关概念
1 组合:把类的实例化放在一个新类里面,就把旧类的内容组合到了新类里面
2 举例:
1 class Turtle(object): 2 def __init__(self,x): 3 self.num = x 4 5 class Fish(object): 6 def __init__(self,x): 7 self.num = x 8 9 class Pool(object): 10 def __init__(self,x,y): 11 self.turtle = Turtle(x) 12 self.fish = Fish(y) 13 14 def print_num(self): 15 print(f"水池里面总共有乌龟{self.turtle.num}只,小鱼{self.fish.num}条!") 16 17 pool = Pool(2,3) 18 pool.print_num()
3 继承和组合的使用时机
二 类、类对象和实例对象
1 实例属性和类属性:
举例:
1 >>> class C(object): 2 ... count = 0 3 ... 4 >>> a = C() 5 >>> b = C() 6 >>> c = C() 7 >>> a.count 8 0 9 >>> b.count 10 0 11 >>> c.count 12 0 13 >>> c.count += 10 14 >>> c.count 15 10 16 >>> a.count 17 0 18 >>> b.count 19 0 20 >>> C.count = 100 21 >>> a.count 22 100 23 >>> b.count 24 100 25 >>> c.count 26 10
上述例子中:C是类对象,而a,b,c是实例对象。类属性(类中定义的变量)和类对象是相互绑定的,并不会依赖于实例对象。
即“c.count += 10” 只是改变了实例对象c对应的实例属性count的值(包括两个动作:创建一个实例属性,并给它赋值为10),并不会对跟类对象绑定的类属性count的值有任何影响;
而“C.count += 100”直接改变了类属性count的值,因为我们之前已经通过“c.count += 10”为实例对象c创建了一个新的实例属性,所以当我们再次执行c.count语句的时候调用的是实例对象C本身的实例属性,其值为10;而另外两个实例对象a,b并没有创建自己的实例属性(进行赋值操作),通过a.count和b.count其实相当于调用类本身的类属性count的值,所以输出为100.
2 属性跟方法
1 >>> class C(object): 2 ... def x(self): 3 ... print("X-man!") 4 ... 5 >>> c = C() 6 >>> c.x() 7 X-man! 8 >>> c.x = 1 9 >>> c.x 10 1 11 >>> c.x() 12 Traceback (most recent call last): 13 File "<stdin>", line 1, in <module> 14 TypeError: ‘int‘ object is not callable
3 到底什么是绑定的概念?
1 >>> class BB(object): 2 ... def printBB(): 3 ... print("no zuo no die") 4 ... 5 >>> BB.printBB() 6 no zuo no die 7 >>> bb = BB() 8 >>> bb.printBB() 9 Traceback (most recent call last): 10 File "<stdin>", line 1, in <module> 11 TypeError: printBB() takes 0 positional arguments but 1 was given
这个例子中,定义printBB()的时候没有参数,后面通过类名(类对象)调用的时候可以正常打印,但是在为该类创建了一个实例对象bb之后,通过实例对象调用printBB()方法却没办法调用,所以说在定义printBB()方法的时候必须定义一个参数用来将实例名称传给该方法,这个过程即为绑定过程
1 >>> class CC(object): 2 ... def setXY(self,x,y): 3 ... self.x = x 4 ... self.y = y 5 ... def printXY(self): 6 ... print(self.x,self.y) 7 ... 8 >>> dd = CC() 9 >>> dd.__dict__ 10 {} 11 >>> CC.__dict__ 12 mappingproxy({‘__module__‘: ‘__main__‘, ‘setXY‘: <function CC.setXY at 0x00000062CE34B670>, ‘printXY‘: <function CC.printXY at 0x00000062CE34B700>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘CC‘ objects>, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘CC‘ objects>, ‘__doc__‘: None})
1 >>> dd.setXY(4,5) 2 >>> dd.__dict__ 3 {‘x‘: 4, ‘y‘: 5} 4 >>> CC.__dict__ 5 mappingproxy({‘__module__‘: ‘__main__‘, ‘setXY‘: <function CC.setXY at 0x00000062CE34B670>, ‘printXY‘: <function CC.printXY at 0x00000062CE34B700>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘CC‘ objects>, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘CC‘ objects>, ‘__doc__‘: None}) 6 >>> del CC 7 >>> ee = CC() 8 Traceback (most recent call last): 9 File "<stdin>", line 1, in <module> 10 NameError: name ‘CC‘ is not defined 11 >>> dd.printXY() 12 4 5
有关继承和组合的内容,可参考:https://www.cnblogs.com/luoxun/p/13476773.html
有关类、类对象、实例对象的内容,可参考:https://www.cnblogs.com/luoxun/p/13411699.html
三 课后作业
原文:https://www.cnblogs.com/luoxun/p/13510118.html