|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
知识点:
一、组合
有些时候用继承也不是,用多继承也不是。这个时候我们就用到了组合。
所谓的组合就是把类的实例化放到一个新的类中,那么新类就把旧类组合进去了。一般是类于类之间的横向关系。
组合一般是把几个没有继承关系的没有直接关系的几个类放到一起。
例)要求定义一个水池类,水池中要有乌龟和鱼。
#如果用水池类继承乌龟和鱼类那么会不太合适,因为水池中有鱼和乌龟,但是水池鱼乌龟和鱼没有共同点
- class Tortoise:
- def __init__(self,x):
- self.num = x
- class Fish:
- def __init__(self,y):
- self.num = y
- class pool:
- def __init__(self,x,y):
- self.tortoise = Tortoise(x) #Tortoise(x)返回的是Tortoise类的实例对象,所以self.x是一个Tortoise类的实例对象。
- self.fish = Fish(y)
- print("一共有乌龟%d只,小鱼%d条。" %(self.tortoise.num,self.fish.num)) #用Tortoise类的实例对象去调用参数num。
- p = pool(1,11)
复制代码
二、类、类对象、实例对象
例
- class A:
- count = 0
- a = A()
- b = A()
- c = A()
- a.count += 10 #此时改变的并不是类A中的count,而是实例对象a的count,可以理解为创建了新的属性count。
- A.count = 100 #在这里改变类A的count,实例对象a中的count不会改变,因为不是一个count。
- print(a.count)
- print(b.count)
- #输出结果
- 10
- 100
复制代码
三、属性名和类中的方法名相同问题:
例)
- class c:
- def x(self):
- print("sss")
- a = c()
- a.x = 3 #意思是创建属性x并赋值为3。此时创建的属性名和类中方法名相同。
- a.x()
- #输出结果会报错
- Traceback (most recent call last):
- File "E:/Python/第039讲.类和对象:拾遗/实验.py", line 43, in <module>
- a.x()
- TypeError: 'int' object is not callable
复制代码
所以为了避免名字上的冲突,大家应该遵守一些约定俗称的规矩。
例如:
不要试图在一个类里边定义出所有能想到的特性和方法,应该利用继承和组合机制来进行扩展。
用不同的词性命名,如属性名用用词,方法名用动词。
四、到底什么是绑定
Python严格要求方法需要有实例才能被调用,这种限制其实就是Python所谓的绑定概念。
- class a:
- def printaa(): #参数没有self,表示不绑定实例对象。
- print("no zuo no die")
- a.printaa() #在这里可以用类去直接访问方法。
- x = a() #但是在这里实例化之后访问方法会报错
- x.printaa() #实际上相当于 x.print(x),但是方法定义的时候没有self,所以报错。
- #输出结果
- no zuo no die #类对象直接访问的结果
- Traceback (most recent call last):
- File "E:/Python/第039讲.类和对象:拾遗/实验.py", line 40, in <module>
- x.printaa()
- TypeError: printaa() takes 0 positional arguments but 1 was given
复制代码
五、__dict__()方法
#用来查看对象的属性和属性对应的值,返回值为字典类型。字典中仅有实例对象的属性,不显示类属性和特殊属性(也就是没有魔法方法)。
返回值:字典,键为属性名,值为属性对应的值。
- class CC:
- def setXY(self,x,y):
- self.x = x
- self.y = y
- def printXY(self):
- print(self.x,self.y)
- d = CC()
- print(CC.__dict__) #查看类对象CC有哪些属性。
- d.setXY(1,2)
- print(d.__dict__) #查看实例对象d有哪些属性。
- del CC #此时删除类对象CC
- d.printXY() #实例对象d依然可以调用类中方法,因为删除的只是类对象,类却还在。
复制代码 |
评分
-
查看全部评分
|