环球ug官方网:Python面试常用的高级用法,怎么动态建立类?

admin/2020-06-06/ 分类:科技/阅读:

本文始发于小我私家民众号:TechFlow,原创不易,求个关注


今天是Python专题的第16篇文章,今天我们来聊聊Python当中的元类。

元类是Python当中的高级用法,若是你之前从来没见过这个术语或者是没听说过这个观点,这是异常正常的,由于一方面它的使用频率不高,另外一方面就是它相对不太容易明了。以至于许多Python开发者都明了得不是很深入,导致了市面上相关的资料也并不太多。我也是读了一些大牛的代码才开启了这扇新世界的大门。

一切都是工具

我们之前的时刻曾经先容过,在Python当中一切都是工具,注重,是一切都是工具。我们都知道工具是类实例化之后的效果,可以简朴地将类和工具类比成模具和制品的关系。模具是类,而凭据模具做出来的产物是工具。

这个比喻头脑对照靠近,然则不完善。由于现实当中一个模具可以做出多个产物,一个产物只有一个模具。但编程语言当中差别,由于类之间可以继续以及多继续,也就是说一个工具可以对应多个类。以是这个比喻不是稀奇合适,然则类和工具的关系是没错的。

然则这就有了一个问题,既然Python当中一切都是工具,那么是不是说类实在也是一个工具呢?也就是说一个模具实在也是另外一个模具的产物?同样,这个模具的模具实在也是另外一个模具的产物,那么我们一直追问下去会怎么样呢?

很简朴,我们做个实验就知道了,我们可以用_class__关键字来查看一个变量的类型,那么我们频频挪用就可以查看其中的关系了:

从上面的图中我们可以发现,num是int类型的变量。我们继续查看int这个类型的类型,获得了type类型。而当我们去查看type的类型的时刻,会发现我们获得的照样一个type的类型。

以是我们可以明了了,type是Python中用来建立所有类的元类,是所有模具的模具。在Python当中,我们把一个类的类叫做元类(metaclass)。以是type就是Python当中内置的元类,我们也可以自己建立我们需要的元类。通过元类,我们建立的工具也是一个类,而不是一个实例。

动态建立类

明了了type是一切类基础之后,再来看动态类就简朴了。动态类是动态语言最大的特征之一,作为典型的动态语言,Python自然也是支持类型的动态建立的。

在Python当中,建立动态类型的一种方式就是通过type关键字。说起来有些意想不到,type函数不是用来查询工具所属的类型的吗,怎么还可以建立类呢?

这实在是type的另外一种用法,作为元类来建立一个类。在这种用法,type函数吸收3个参数,分别是类型的名称,父类的元组,以及一个字典。除了第一个参数之外,后面两个参数都可以为空。好比我们来看一个例子:

注重,type返回的效果是一个类,而不是一个实例。以是我们还可以通过它建立实例:

hello = Hello() 

这样建立出来的是最简朴的空类,它什么也没有,和下面的代码等价。

class Hello:  pass 

我们也可以在type的参数当中为这个类填充属性和方式:

def hello_world(self):  print('hello')  Hello = type('Hello', (), {'hello':hello_world, 'num': 3}) 

这样我们就为Hello这个类建立了一个方式叫做hello,一个属性num即是3。我们可以来挪用一下试试:

也就是说我们可以使用type来凭据我们的需要自行界说类,只不过type既可以获取工具的类型又可以建立新的类,看起来可能以为有些不太直观,然则实在这也是说得通的。我们在Python当中通过挪用str建立一个string工具,通过int来建立一个integer工具,那么通过type则是建立一个类的工具。

实现继续

我们之前说了,当我们使用type来建立类的时刻,还可以传入父类的元组从而实现类的继续。

好比我们再建立一个叫做World的类继续适才通过type建立出来的Hello类,然后在为它加上分外的函数:

def say_world(self):  print('World')  World = type('World', (Hello, ), {'world': say_world}) 

注重这里传入第二个参数是父类的元组,既然是元组,那么当元素只有一个的时刻,需要加上逗号,示意这是一个元组。这样建立出来的类和我们通过class界说的静态类效果是一样的:

也就是说,我们可以先把函数实现,然后再凭据义务的需要把这些函数组装成新的类。显然,这和传统的C 以及Java这些静态类型的语言相比,要天真得多。

总结

我们虽然可以通过type来建立动态建立类,然则从上面的使用历程也应该看得出来,这样使用起来并不太利便,而且许多进阶的功效很难实现。举个简朴的例子,好比我们想要动态地为一个已有的类添加一些动态的方式,天生新的类。我们使用type就很难实现。type也简直不是Python元类的主要运用,metaclass才是王道,但由于篇幅限制,这部门将放在下一篇文章当中。

固然,元类是一个异常高级的用法,以至于Python的创始人说99%的Python程序员并不需要用到它。以是若是你以为明了起来异常费劲的话也没有关系,知道这么个观点就可以了。

今天的内容就是这些,若是喜欢本文,可以的话,请点个关注,给我一点激励,也利便获取更多文章。

,

欧博网址开户

www.ludiealliedinstitute.com欢迎进入欧博网址(Allbet Gaming),欧博网址开放会员注册、代理开户、电脑客户端下载、苹果安卓下载等业务。

TAG:
阅读:
广告 330*360
广告 330*360
Sunbet_进入申博sunbet官网
微信二维码扫一扫
关注微信公众号
新闻自媒体 Copyright © 2002-2019 Sunbet 版权所有
二维码
意见反馈 二维码