小甲鱼Python第039讲:类和对象:拾遗 | 课后测试题及参考答案

测试题

0.什么是组合(组成)?

  Python继承机制很有用,但容易把容易代码复杂化以及依赖隐含继承。因此,经常的时候,我们可以使用组合代替。在Python里组合其实很简单,直接在类定义中把需要的类放进去实例化就可以了。

eg:

 1 # 乌龟类
 2 class Turtle:
 3     def __init__(self,x):
 4         self.num = x
 5 # 鱼类
 6 class Fish:
 7     def __init__(self,x):
 8         self.num = x
 9 # 水池类
10 class Pool:
11     def __init__(self,x,y):
12         self.turtle = Turtle(x)#组合乌龟类进来
13         self.fish = Fish(y)#组合鱼类进来
14 
15     def print_num(self):
16         print("水池中总共有乌龟%d只,小鱼%d条。" % (self.turtle.num,self.fish.num))
17 
18 >>>pool  = Pool(4,5)
19 >>>pool.print_num()

 

1.什么时候用组合,什么时候用继承?

  根据实际应用场景确定。简单的说,组合用于“有一个”的场景中,继承用于“是一个”的场景中。例如,水池里面有一个乌龟,天上有一只小甲鱼,这些适合使用组合。青瓜是瓜,女人是人,鲨鱼是鱼,这些就应该使用继承啦。

 

2.类对象实在什么时候产生?

  当你这个类定义完的时候,类定义就变成了类对象,可以直接通过“类名.属性”或者“类名.方法名()”引用或使用相关的属性或方法。

 

3.如果对象的属性跟方法名字相同,会怎样?

  如果对象的属性和方法名相同,属性就会覆盖方法。

 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
10 >>> c.x
11 1
12 >>> c.x()
13 Traceback (most recent call last):
14 
15   File "<pyshell#50>", line 1, in <module>
16     c.x()
17 TypeError: 'int' object is not callable

 

4.请问有效类定义中哪些是类属性,哪些是实例属性?

1 class C:
2     num = 0
3     def __init__(self):
4         self.x =4
5         self.y = 5
6         C.count = 6

  num和count是类属性(静态变量),x和y是实例属性。大多数情况下,应该考虑使用实例属性,而不是类属性(类属性通常仅用来跟踪与类相关的值)

5.请问以下代码中,bb对象为什么调用printBB()方法失败?

1 >>> class B:
2     def printB():
3         print("no zuo no die")        
4 >>> b = B()
5 >>> b.printB()
6 Traceback (most recent call last):
7   File "<pyshell#54>", line 1, in <module>
8     b.printB()
9 TypeError: printB() takes 0 positional arguments but 1 was given

  因为Python严格要求方法需要有实例才能调用,这种限制其实就是Python所谓的绑定概念。所以Python会自动把bb对象作为第一个参数传入,所以才会出现TypeError:"需要0个参数,但实际传入了1个参数"。

1 >>> class B:
2     def printB(self):
3         print("no zuo no die")
4 
5         
6 >>> b = B()
7 >>> b.printB()
8 no zuo no die

 

动动手:

0.思考这一讲我学习的内容,请动手在一个类中定义一个变量,用于跟踪该类有多少个实例被创建(当实例化一个对象,这个变量+1,当销毁一个对象,这个变量自动-1)

 1 >>> class D:
 2     count = 0 
 3     def __init__(self):
 4         D.count += 1
 5 
 6     def __del__(self):
 7         D.count -= 1
 8 
 9         
10 >>> a = D()
11 >>> b = D()
12 >>> D.count
13 2
14 >>> c = D()
15 >>> d = D()
16 >>> D.count
17 4
18 >>> del c
19 >>> D.count
20 3

 

 

 

 1 class Stack:
 2     def __init__(self,start=[]):
 3         self.stack = []
 4         for each in start:
 5             self.push(each)
 6     def isEmpty(self):
 7         return not self.stack
 8     def push(self,value):
 9         self.stack.append(value)
10     def top(self):
11         if not self.stack:
12             print("栈为空")
13         else:
14             return self.stack[-1]
15     def bottom(self):
16         if not self.stack:
17             print("警告:栈为空。")
18         self.base = self.stack[0]
19     def pop(self):
20         if not self.stack:
21             print("栈为空")
22         else:
23             return self.stack.pop()

 

posted @ 2020-08-15 16:14  逆袭小白  阅读(438)  评论(0编辑  收藏  举报