前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python面试必备,看完轻轻松松拿到10k

Python面试必备,看完轻轻松松拿到10k

原创
作者头像
用户1682544
发布2018-05-01 13:40:01
7510
发布2018-05-01 13:40:01
举报

Python面试精选

平时我们几乎不可能用到的东西,像那些类里面的魔法方法,你还记得几个,这些可都是面试必备啊~

精选其中三个,大家如果觉得不够可以和我们一起讨论哦~~~

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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python面试精选
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档