039类和对象:拾遗
1.组合:把类的实例话放到一个新类里面
python的继承很有用,但容易把代码复杂化以及依赖隐含继承。因此,可以用组合代替。
直接在类定义中把需要的类放进去实例化就可以了
那什么时候用组合,什么时候用继承呢?
组合:“有一个”,例如,水池里有一个乌龟,天上有一个鸟。
继承:“是一个”,例如,青瓜是瓜,女人是人,鲨鱼是鱼。
如:1 #!/usr/bin/python
2 #coding:utf8
3
4 class Turtle:
5 def __init__(self,x):
6 self.num = x
7
8 class Fish:
9 def __init__(self,x):
10 self.num = x
11
12 class Pool:
13 def __init__(self,x,y):
14 self.turtle = Turtle(x) #类的实例化
15 self.fish = Fish(y) #类的实例化
16
17 def print_num(self):
18 print("水池里共有乌龟%d只,小鱼%d条" (self.turtle.num,self.fish.num))
19
20 pool = Pool(1,10)
21 pool.print_num()
2.类、类对象和实例对象
当类定义完的时候,类定义就变成了类对象,可以直接通过"类名.属性"或者"类名.方法名()"引用属性和方法
>>> class C:
... count = 0
...
>>> a = C()
>>> b = C()
>>> c = C()
>>> a.count
0
>>> b.count
0
>>> c.count
0
>>> c.count += 10
>>> c.count
10
>>> a.count
0
>>> b.count
0
>>> C.count += 100
>>> a.count
100
>>> b.count
100
>>> c.count
10
>>> C.count
100
3.如果属性和名字和方法相同,属性会把方法覆盖掉
如:>>> class C:
... def x(self): #定义x方法
... print("X-man")
...
>>> c = C()
>>> c.x() #调用C类的x方法
X-man
>>> c.x = 1 #此时给实例对象c定义一个x属性并赋值1
>>> c.x #调用c的x属性是正常的
1
>>> c.x() #但此时再调用x方法就不可以了,因为重名的x属性覆盖了x方法
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
4.什么是绑定?
python严格要求方法需要有实例才能被调用,这种限制就是绑定
如:>>> class B:
... def printB(self):
... print("BB")
...
>>> B.printB() #没有实例化直接调用方法会报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method printB() must be called with B instance as first argument (got nothing instead)
>>> b = B()
>>> b.printB() #实例化以后再调用就没有问题了
BB
练习:
1.在类中定义一个变量,用来追踪有多少个实例被创建
实例化一个对象,变量+1;销毁一个对象,变量-1
1 #!/usr/bin/python
2 #coding:utf8
3
4 class AA:
5 count = 0
6 def __init__(self):
7 AA.count += 1
8
9 def __del__(self):
10 AA.count -= 1
11 a = AA()
12 b = AA()
13 c = AA()
14 print(AA.count)
15 del a,b
16 print(AA.count)
运行结果为3,1
2.定义一个栈(Stack)类,用于模拟一种具有后进先出(LIFO)特性的数据结构
方法:isEmpty():判断当前栈是否为空(返回True或Talse)
push():往栈的顶部压入一个数据项
pop():从栈顶弹出一个数据项(并在栈中删除)
top():显示当前栈顶的一个数据项
bottom():显示当前栈底的一个数据项
1 #!/usr/bin/python
2 #coding:utf8
3
4 class Stack:
5 def __init__(self,stack=[]):
6 self.stack = []
7 for x in stack:
8 self.push(x)
9
10 def isEmpty(self):
11 return not self.stack
12
13 def push(self,obj):
14 self.stack.append(obj)
15
16 def pop(self):
17 if not self.stack:
18 print("Stack is empty!")
19 else:
20 return self.stack.pop()
21
22 def top(self):
23 if not self.stack:
24 print("Stack is empty!")
25 else:
26 return self.stack[-1]
27
28 def bottom(self):
29 if not self.stack:
30 print("Stack is empty!")
31 else:
32 return self.stack[0]
33
34 s = Stack()
35 s.push(1)
36 s.push(2)
37 s.push(3)
38 print"插入数字1,2,3:"
39 print "top:",s.top()
40 print "bottom:",s.bottom()
41 print "pop1:",s.pop()
42 print "pop2:",s.pop()
43 print "pop3:",s.pop()
44 print "isEmpty:",s.isEmpty()
运行结果:# python Stack.py
插入数字1,2,3:
top: 3
bottom: 1
pop1: 3
pop2: 2
pop3: 1
isEmpty: True