在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'>
綜上所述,這篇文章就給大家介紹完畢,希望可以給大家帶來幫助。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/128849.html
摘要:測試對象是否為某類型返回以內的倍數返回是一堆或者當為偶數時生成一個新列表將其加入中的,就是用定義的一個匿名函數,并通過函數,將其應用到列表中的每個元素。 1.1 使用函數 在Python中,函數必須先聲明,然后才能調用它,使用函數時,只要按照函數定義的形式,向函數傳遞必需的參數,就可以調用函數完成相應的功能或者獲得函數返回的處理結果。 如果函數有返回值,那么需要在函數中使用retur...
摘要:類元編程是指在運行時創建或定制類的技藝。注意在中做元編程時最好不要用和函數。三元類基礎知識元類是類元編程最高級的工具使用元類可以創建具有某種特質的全新變種,例如抽象基類。建議除非開發框架,否則不要在生產代碼中定義元類或抽象基類。 導語:本文章記錄了本人在學習Python基礎之元編程篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學習并交流。 本文重點: 1、了解運行時創建...
摘要:什么是支持向量機支持向量機是一種有監督的機器學習算法,可用于分類任務或回歸任務。支持向量機是一個最好地隔離兩個類超平面或者說分類線的前沿算法。接下來,我們將討論支持向量機如何工作。 showImg(https://segmentfault.com/img/remote/1460000019599694); 介紹 掌握機器學習算法并不是一個不可能完成的事情。大多數的初學者都是從學習回歸開...
摘要:什么是元類剛才說了,元類就是創建類的類。類上面的屬性,相信愿意了解元類細節的盆友,都肯定見過這個東西,而且為之好奇。使用了這個魔法方法就意味著就會用指定的元類來創建類了。深刻理解中的元類 (一) python中的類 今天看到一篇好文,然后結合自己的情況總結一波。這里討論的python類,都基于python2.7x以及繼承于object的新式類進行討論。 首先在python中,所有東西都...
閱讀 911·2023-01-14 11:38
閱讀 878·2023-01-14 11:04
閱讀 740·2023-01-14 10:48
閱讀 1982·2023-01-14 10:34
閱讀 942·2023-01-14 10:24
閱讀 819·2023-01-14 10:18
閱讀 499·2023-01-14 10:09
閱讀 572·2023-01-14 10:02