在Python里全部都是目标(object),引用类型,如数据,字符串数组,函数公式全是目标。目标需要由类(class)开展建立。那样即然全部都是目标,那样类是目标吗?没错,类都是目标,那样也是谁创造了类呢?回答很简单,都是类,一个可以写作类类,称作(type)元类
类的定义
目标是由类建立的,如下边的编码:
#object为高层成员变量 classWork(object): a=100 Mywork=Work()#创建对象 print(Mywork)#Mywork是Work所建立的一个对象<__main__.Workobjectat0x101eb4630> print(type(Mywork))# print(type(Work))#为非元类
分析:
能够看见目标Mywork是类Work建立的案例。然可是能够看见Work的种类的时候由一个叫type的类建立的案例。即Mywork—》Work—》type创建
上边的事例中目标是实例化的,类乃是根据搜索关键词class申明界定的
那样class搜索关键词其背后的洞天到底是什么呢?
事实上,classWork(object)这种编码,等额的于Work=type(‘Work’,(objects,),{“a”:100})
即类type通过创建对象创立了它目标Work,而且这个Work往往是一个类,这样可以创建类的类,便是Python的元类。而在python中自带的元类叫:type
一、什么叫元类
用于创建类的类,称为元类
类是元类建立出去对象
函数公式type事实上是个元类,type便是Python在身后用于建立全部类元类
二、留意区别元类及传承的成员变量
type是元类,每一个类也是通过type所建立出的
object高层的成员变量,全部类的继承高层成员变量全是object
三、type元类应用
能够看见type是小写字母,正常情况下都会觉得是一款函数公式,根据网页源代码去看看如下所示界定的:
classtype(object): """ type(object_or_name,bases,dict) type(object)->theobject'stype type(name,bases,dict)->anewtype """ #创建对象 def__init__(cls,what,bases=None,dict=None):#knownspecialcaseoftype.__init__ """ type(object_or_name,bases,dict) type(object)->theobject'stype type(name,bases,dict)->anewtype #(copiedfromclassdoc) """ pass #创建类 staticmethod#knowncaseof__new__ def__new__(*args,**kwargs):#realsignatureunknown """ Createandreturnanewobject.Seehelp(type)foraccuratesignature. (建立并返回一个新目标) """ pass type的用法一:获取数据时那种种类:type(object)->theobject’stype a=100 b="100" c=[11,22,33] print(type(a))#======》 print(type(b))#======》 print(type(c))#======》
type的用法二:创建类:type(object_or_name,bases,dict)
1.在查看源码的时候,能够看见在初始化时,init__方法接受三个参数,type在创建对象的过程,也会重新建立一个新的类,而创建类的编码来自__new方法,它参数与__init__方法是一样的。
2.当调用type开展创建对象的时候,会先自动调用new方法,再调用__init__方法,最终会创建对象一个对象,这个目标是一个类。
1.元类type的init方法有3个参数:
1.name:类名(字符串类型)
2.bases:传承的成员变量(元祖种类)
3.dict:属性和方法组成的字典(字典种类)
具体例子:
#根据class定义类 classMyclass(object): a=100 b=200 #根据type创建的类(实例化类) Myclass1=type("Myclass1",(object,),{"a":"100","b":"200"}) print(Myclass) print(Myclass1) 如果需要定义实例方法和类属性怎么办呢?,将方法和属性以字典的形式传进去 defwork(self): print("这是实例方法——————work————————") #定义类属性值 definit_method(self,aa,bb,cc): self.aa=aa self.bb=bb self.cc=cc #根据type创建的类(实例化类) Myclass2=type("Myclass2",(object,),{"a":"100","b":"200","work":work,"work_1":work_1,"__init__":init_method}) m=Myclass2(11,22,33) m.work() print(m.aa,m.bb,m.cc)
四、自定义元类的使用
既然元类可以创建类,那也可以自定义元类,自定义直接继承类type,在自定义元类的步骤:
1.定义一个类继承type
2.重写new方法
具体例子:
#定义一个类继承type class Mytest(type): #重写new方法 def __new__(cls,type_name,bases,atter,*args,**kwargs): new_cls=super().__new__(cls,type_name,bases,atter) return new_cls#返回新的类 M2=Mytest("M2",(Mytest,),{"atter":100}) print(M2)#=====》<class'__main__.M2'>
使用class创建类的时候指定自定义的元类
1.不去指定时,默认创建都是type类
2.指定自定义的元类去创建类:metaclass=指定的元类
class Myclass(type): """自定义的元类""" def __new__(cls,type_name,bases,attrs,*args,**kwargs): new_cls=super().__new__(cls,type_name,bases,attrs) print("这个是Myclass:",type_name,bases,attrs,) return new_cls #通过metaclass=xxxx继承自定义元类 class Inherited_class(metaclass=Myclass): a=100 b=200 print(type(Inherited_class))#======》<class'__main__.Myclass'>
综上所述,这篇文章就给大家介绍完毕,希望可以给大家带来帮助。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/128849.html
摘要:测试对象是否为某类型返回以内的倍数返回是一堆或者当为偶数时生成一个新列表将其加入中的,就是用定义的一个匿名函数,并通过函数,将其应用到列表中的每个元素。 1.1 使用函数 在Python中,函数必须先声明,然后才能调用它,使用函数时,只要按照函数定义的形式,向函数传递必需的参数,就可以调用函数完成相应的功能或者获得函数返回的处理结果。 如果函数有返回值,那么需要在函数中使用retur...
摘要:类元编程是指在运行时创建或定制类的技艺。注意在中做元编程时最好不要用和函数。三元类基础知识元类是类元编程最高级的工具使用元类可以创建具有某种特质的全新变种,例如抽象基类。建议除非开发框架,否则不要在生产代码中定义元类或抽象基类。 导语:本文章记录了本人在学习Python基础之元编程篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。 本文重点: 1、了解运行时创建...
摘要:什么是支持向量机支持向量机是一种有监督的机器学习算法,可用于分类任务或回归任务。支持向量机是一个最好地隔离两个类超平面或者说分类线的前沿算法。接下来,我们将讨论支持向量机如何工作。 showImg(https://segmentfault.com/img/remote/1460000019599694); 介绍 掌握机器学习算法并不是一个不可能完成的事情。大多数的初学者都是从学习回归开...
摘要:什么是元类刚才说了,元类就是创建类的类。类上面的属性,相信愿意了解元类细节的盆友,都肯定见过这个东西,而且为之好奇。使用了这个魔法方法就意味着就会用指定的元类来创建类了。深刻理解中的元类 (一) python中的类 今天看到一篇好文,然后结合自己的情况总结一波。这里讨论的python类,都基于python2.7x以及继承于object的新式类进行讨论。 首先在python中,所有东西都...
阅读 873·2023-01-14 11:38
阅读 819·2023-01-14 11:04
阅读 668·2023-01-14 10:48
阅读 1823·2023-01-14 10:34
阅读 874·2023-01-14 10:24
阅读 738·2023-01-14 10:18
阅读 466·2023-01-14 10:09
阅读 500·2023-01-14 10:02