python的数据模型其实就是魔法函数。因为我们定义一些类声明了他的定义数据模型就会用神奇的功能,比如上节笔记中__getitem__定义之后的类变成了了一个可迭代的对象。
正因为有如此神奇的功能,我们称这些数据模型为魔法函数。
这次来,再补充说明一下上节课中的__getitem__,以及介绍一个新的魔法函数:__len__:
class Company:
def __init__(self, employee_list):
self.employee = employee_list
def __getitem__(self, item):
return self.employee[item]
company = Company(['tom', 'bob', 'jane'])
company1 = company[:2]
print(len(company1))
print(company1)
print(type(company1))
for i in company1:
print(i)
output1.PNG
还是熟悉的代码,但是我们看到了不一样的东西,这边我们的company居然还有切片的能力,这要多得__getitem__函数的功劳,但是返回的却是一个list对象,对象类型都改变了(后面会补充怎么定义丰富的魔法函数使我们的对象返回的还是对象本身),所以也不难说明为什么len(company1)没有错误。
注意:
__getitem__魔法函数并不是实现for循环的关键,在python的数据模型中内部有个专门定义迭代的数据模型为__iter__,在进行迭代时python会优先寻找这个数据模型的定义,当找不到会往上寻找会找到是否有定义__getitem__这个数据模型,再根据这个数据模型的定义进行处理,都找不到就意味着这个类对象不是可迭代类型的类,强行进行for循环就会报错。
len() 函数的使用。
总所周知len()函数通常用于返回数据结构的长短,常见的我们有时会查询列表长度....
在上面定义的类中,我们要返回员工employee列表的总人数,理论上我们也要做一个类似与len()功能的方法。
class Company:
def __init__(self, employee_list):
self.employee = employee_list
def __getitem__(self, item):
return self.employee[item]
def __len__(self):
return len(self.employee)
company = Company(['tom', 'bob', 'jane'])
print(len(company))
我就直接解释了,当我们在全局使用len()取查询一个对象的长度时,len()会进入到当前实例所定义的类中寻找他的魔法函数__len__,通过这个魔法函数取得返回。
不信?
我们可以做实验,在上面定义__len__函数中,返回的时employee的长的,因为实例中employee是一个列表,调用列表对象的len()在python内置当然会正确返回这个列表的长度所以为3。
我们可以做这样的一个实验修改他的返回,我们返回个字符串'sb',看看会发生什么。
class Company:
def __init__(self, employee_list):
self.employee = employee_list
def __getitem__(self, item):
return self.employee[item]
def __len__(self):
return 'sb'
# return 100
company = Company(['tom', 'bob', 'jane'])
print(len(company))
报错了,看来不能瞎逼返回,根据他的意思返回必须是一个整数,那我们就返回个100看看。
好了这节笔记就到这了,有没有对python的数据模型有更深的理解呢?
总结: 魔法函数不用我们显式的去调用,我们声明了魔法函数意味着这个对象就有特别的功能,我们是不需要像XXX.goxx()这个样取调用我们的魔法方法的。