平时我们几乎不可能用到的东西,像那些类里面的魔法方法,你还记得几个,这些可都是面试必备啊~
精选其中三个,大家如果觉得不够可以和我们一起讨论哦~~~
1.什么是__call__函数
1).这个是不是非常非常罕见,几乎从来用不到这个内置的函数!错了,其实我们在用类的几乎时时在用.__call__可以让类模拟函数的行为.如果一个对象提供了该方法,就可以像函数一样使用它
示例
运行f对象的时候会去调用__call__函数.这个语法其实非常有趣,算是把这个类型的对象当作函数来使用,相当于重载了括号运算符。
2).__call__这个概念会涉及到类装饰器
类装饰器其实是一个非常复杂的概念,这里我们看一个小例子来简单的理解一下:
这个稍微有一点复杂,我们设计一个decorator类,然后在add函数的时候用类装饰器,这个时候add函数已经不是简单的函数了,因为用了类装饰器,摇身一变升官了,而是add=decorator(add),add已经是嫁入豪门,add其实是decorator类的一个对象了.
也就是把add函数的地址传入了decorator里面的init函数,并且返回一下对象实例add.所以当你运行add(1,2)的时候就会调用__call__函数.
2.__new__和__init__的区别
前面有一篇文章(这8道Python面试题,你答不答的出来),__init__方法其实是初始化方法,真正的构造方法是__new__。__new__是类方法.
当时没有举例子,不太好理解,这里我们看一个小例子,比如我们都知道tuple元组是不可变对象,如果我们想自己构造一个新的元组返回都是int,我们自定义一个IntTuple来继承tuple,来深入理解一下__new__和__init__的秘密。
也就是说我们我们传进去的seq[1,-1,'-a'],在__init__里面是没有地方可以更改的,那如何更改呢,这是时候__new__要上场了.
init里面无法动手脚,我们只能往前追踪,看看它的上游new里面是否可以动态的改变!类初始化的时候首先运行了__new__函数,传入seq。
我们对seq进行过滤处理,只留一下int类型,然后__new__里面return返回处了类的实例给__init__(),其实__init__里面的self就是__new__返回的!
3.__set__,__get__,__delete__都是啥
1).这3个特殊的函数说实话我学Python的时候都没有用过,后来在看一些进阶的书的时候才发现它的妙用!
其实都是Python类里面的描述符概念,描述符允许你自定义在引用一个对象属性是应该完成的事情。这3个特殊的方法组合了Python里面的描述法协议:
###############################################################################
__set__:在设计属性的时候被调用
__get__:在读取属性的时候被调用
__delete__:在删除属性的时候被调用
下面举一个小例子,看看它的妙用,比如我们要设计一个类,我们希望它能想C,C++那样对它们的实例属性做类型检查:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。