Python基础入门学习笔记 039 类和对象:拾遗

发布时间 2023-08-23 10:59:15作者: 一杯清酒邀明月

组合(将需要的类一起进行实例化并放入新的类中)

实例:

 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所谓的绑定概念。