python数据模型的意义_2-2 python的数据模型以及数据模型对python的影响

本文介绍了Python数据模型中的魔法函数,特别是__getitem__和__len__。通过示例解释了如何使用__getitem__实现类的可迭代性和切片操作,以及__len__函数在确定对象长度时的作用。魔法函数使得类具有特殊功能,而无需直接调用特定方法。
摘要由CSDN通过智能技术生成

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()这个样取调用我们的魔法方法的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值