python高级编程(2) - 魔法函数

魔法函数

一,什么是魔法函数

在触发某些条件的情况下回自动调用的函数,以双下划线开头和结尾,例如 __iter__, __getitem__

class Company(object):
    def __init__(self, employee_list):
        self.employee_list = employee_list		①

    def __getitem__(self, item):return self.employee_list[item]

company = Company(['Tom', 'Ary', 'Jack'])

for em in company:print(em)

① 实例的时候接受参数

② 实现 __getiter__ 魔法方法,实现此方法的对象是一个序列,每次被迭代item就会以 0, 1, 2等去取属性里面 的值,直到抛出异常位置

③ for 循环背后实际上是首先做的事情是对in 后面的对象进行iter,若有迭代器,对迭代器进行迭代,否则调用 __getitem__ 方法

二,python数据模型对python的影响

魔法函数实际上就是叫做数据模型,因为网上都叫魔法函数,叫多就成自然了

class Company(object):
    def __init__(self, employee_list):
        self.employee_list = employee_list

    def __getitem__(self, item):
        return self.employee_list[item]

    def __len__(self):
        return len(self.employee_list)

company = Company(['Tom', 'Ary', 'Jack'])

for em in company:			# 实现了迭代的方法
    print(em)

print(company[:2])			# 实现了序列的方法

print(len(company))			# 实现了 len 的方法


----------------------------------------

Tom
Ary
Jack
['Tom', 'Ary']
3

python 的魔法函数会对代码的运行产生影响,在某些触发的情况下能自动在背后隐式调用,实现一个 __len__ 就能够对实例实现 len() 的方法,实现 __getitem__ 方法就能被 for 循环和 切片 引用

三,python魔法函数一览

class Company(object):
    def __init__(self, employee_list):
        self.employee = employee_list

    def __repr__(self):
        """
        调试专用的方法,在解释器里面生效
        """
        return 'employee : {}'.format(self.employee)

    def __str__(self):
        """
        使用print会自动调用这个方法
        :return:
        """
        return '我是print打印出来的'

c = Company(['Jack', 'Jan', 'Meric'])
print(c)
c
...
我是print打印出来的
employee : ['Jack', 'Jan', 'Meric']

__repr__ 对开发者友好,能够在交互式模式下输出信息

__str__ 对使用者友好,在实例被打印时被调用

四,len函数的特殊性

len() 函数内部有优化,性能非常高,len(一个内置类型),一下子就能获取长度,因为内部c语言在创建数据类型的时候默认维护数据类型的长度,调用的时候直接是取值的,效率高

五,本章小结

实现对应数据类型的魔法函数就能够变成对饮的数据类型,例如一个类实现 __getitem__ 魔法函数,那个他就是一个序列类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值