马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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依然可以调用类中方法,因为删除的只是类对象,类却还在。
|