组合(将需要的类一起进行实例化并放入新的类中)
实例:
1 class Turtle:
2 def __init__(self,x):
3 self.num = x
4
5 class Fish:
6 def __init__(self,x):
7 self.num = x
8
9 class Pool:
10 def __init__(self,x,y):
11 self.turtle = Turtle(x)
12 self.fish = Fish(y)
13
14 def print_num(self):
15 print('水池里一共有乌龟 %d 条,鱼 %d 条' % (self.turtle.num,self.fish.num))
16
17 >>> pool = Pool(5,2)
18 >>> pool.print_num()
19 水池里一共有乌龟 5 条,鱼 2 条
•现在要求定义一个类,叫水池,水池里要有乌龟和鱼。
类、类对象和实例对象
以下例子可见,对实例对象c的count属性赋值后,就相当于覆盖了类对象C的count属性。如果没有赋值覆盖,那么引用的是类对象的count属性
1 >>> a = C()
2 >>> b = C()
3 >>> c = C()
4 >>> print(a.count,b.count,c.count)
5 0 0 0
6 >>> c.count += 10
7 >>> print(a.count,b.count,c.count)
8 0 0 10
9 >>> C.count += 100
10 >>> print(a.count,b.count,c.count)
11 100 100 10
另外,如果属性的名字跟方法名相同,属性会覆盖方法:
1 >>> class C:
2 def x(self):
3 print('X-man')
4
5
6 >>> c = C()
7 >>> c.x()
8 X-man
9 >>> c.x = 1 #新定义对象c的一个x属性,并赋值为1
10 >>> c.x
11 1
12 >>> c.x() #可见,方法x()已经被属性x给覆盖了
13 Traceback (most recent call last):
14 File "<pyshell#8>", line 1, in <module>
15 c.x()
16 TypeError: 'int' object is not callable
结论:不要试图在一个类里边定义出所有能想到的特性和方法,应该利用继承和组合机制来进行扩展;用不同的词性命名,如属性名用名词、方法名用动词,并使用骆驼命名法等。
到底什么是绑定?
实例1:(python严格要求需要有实例才能被调用,即绑定概念)
1 >>> class BB:
2 def printBB(): #缺少self,导致无法绑定具体对象
3 print('no zuo no die')
4
5
6 >>> BB.printBB()
7 no zuo no die
8 >>> bb = BB()
9 >>> bb.printBB() #出现错误原因是由于绑定机制,自动把bb对象作为第一个参数传入
10 Traceback (most recent call last):
11 File "<pyshell#15>", line 1, in <module>
12 bb.printBB()
13 TypeError: printBB() takes 0 positional arguments but 1 was given
•Python严格要求方法需要有实例才能被调用,这种限制其实就是Python所谓的绑定概念。