最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python超詳細(xì)講解元類的使用

 更新時間:2022年06月28日 10:19:18   作者:henry_rhy  
在Python里一切都是對象(object),基本數(shù)據(jù)類型,如數(shù)字,字符串,函數(shù)都是對象。對象可以由類(class)進(jìn)行創(chuàng)建。那么既然一切都是對象,那么類是對象嗎?是的,類也是對象,那么又是誰創(chuàng)造了類呢?答案也很簡單,也是類,一個能創(chuàng)作類的類,稱之為(type)元類

類的定義

對象是通過類創(chuàng)建的,如下面的代碼:

# object 為頂層基類
class Work(object):
    a = 100
Mywork = Work()   # 實例化
print(Mywork )   # Mywork 是 Work 所創(chuàng)建的一個對象  <__main__.Work object at 0x101eb4630>
print(type(Mywork))    # <class '__main__.Work'>
print(type(Work))    # 類型為元類 <class 'type'>

解析:

可以看見對象 Mywork 是類 Work 創(chuàng)建的實例。然但是可以看到Work的類型時由一個叫 type 的類創(chuàng)建的實例。即 Mywork —》 Work —》 type 創(chuàng)建

上面的例子中對象是動態(tài)創(chuàng)建的,類則是通過關(guān)鍵字 class 聲明定義的

那么class關(guān)鍵字背后的玄機(jī)是什么呢?

  • 實際上,class Work(object) 這樣的代碼,等價于 Work = type(‘Work’, (objects, ), {“a”:100})
  • 即類 type 通過實例化創(chuàng)建了它的對象 Work,而這個 Work 恰恰是一個類,這樣能創(chuàng)建類的類,就是 Python 的元類。而在python中內(nèi)置的元類叫:type

一、什么是元類

  • 用來創(chuàng)建類的類,叫做元類
  • 類是元類創(chuàng)建出來的對象
  • 函數(shù)type實際上是一個元類,type就是Python在背后用來創(chuàng)建所有類的元類

二、注意區(qū)分元類和繼承的基類

  • type是元類,所有的類都是通過type所創(chuàng)建出來的
  • object頂層的基類,所有類的繼承頂層父類都是object

三、type 元類的使用

可以看到type是小寫,一般情況下都會認(rèn)為它是一個函數(shù),通過查看源代碼去看下如下定義的:

class type(object):
"""
type(object_or_name, bases, dict)
type(object) -> the object's type
type(name, bases, dict) -> a new type
"""
	# 實例化
	def __init__(cls, what, bases=None, dict=None): # known special case of type.__init__
	     """
	     type(object_or_name, bases, dict)
	     type(object) -> the object's type
	     type(name, bases, dict) -> a new type
	     # (copied from class doc)
	     """
	     pass
	# 創(chuàng)建類    
	@staticmethod     # known case of __new__
    def __new__(*args, **kwargs):   # real signature unknown
        """ 
        Create and return a new object.  See help(type) for accurate signature. 
        (創(chuàng)建并返回一個新對象)
        """
        pass

type的用法一:獲取數(shù)據(jù)時那種類型 : type(object) -> the object’s type

a = 100
b = "100"
c = [11,22,33]
print(type(a))    # ======》 <class 'int'>
print(type(b))    # ======》 <class 'str'>
print(type(c))    # ======》 <class 'list'>

type的用法二:創(chuàng)建類:type(object_or_name, bases, dict)

1.在查看源碼的時候,可以看到在初始化時,init__方法接受三個參數(shù),type 在實例化的過程,也會重新創(chuàng)建一個新的類,而創(chuàng)建類的代碼來自__new 方法,它的參數(shù)與 __init__方法是一樣的。

2.當(dāng)調(diào)用 type 進(jìn)行實例化的時候,會先自動調(diào)用 new 方法,再調(diào)用__init__方法,最終會實例化一個對象,這個對象是一個類。

1. 元類 type 的 init 方法有3個參數(shù):

 1.name:類名(字符串類型)
 2.bases:繼承的父類(元祖類型)
 3.dict:屬性和方法組成的字典(字典類型)

具體例子:

# 通過 class 定義類
class Myclass(object):
    a = 100
    b = 200
# 通過type創(chuàng)建的類(動態(tài)創(chuàng)建類)
Myclass1 = type("Myclass1",(object,),{"a":"100","b":"200"})
print(Myclass)
print(Myclass1)

如果需要定義實例方法和類屬性怎么辦呢?,將方法和屬性以字典的形式傳進(jìn)去

def work(self):
    print("這是實例方法——————work————————")
# 定義類屬性值
def init_method(self, aa, bb, cc):
    self.aa = aa
    self.bb = bb
    self.cc = cc
# 通過type創(chuàng)建的類(動態(tài)創(chuàng)建類)
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)

四、自定義元類的使用

既然元類可以創(chuàng)建類,那也可以自定義元類,自定義直接繼承類 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創(chuàng)建類的時候指定自定義的元類

1.不去指定時,默認(rèn)創(chuàng)建都是type類

2.指定自定義的元類去創(chuàng)建類: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'>

到此這篇關(guān)于Python超詳細(xì)講解元類的使用的文章就介紹到這了,更多相關(guān)Python元類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python實現(xiàn)簡單的udp發(fā)送和接收

    python實現(xiàn)簡單的udp發(fā)送和接收

    這篇文章主要介紹了python實現(xiàn)簡單的udp發(fā)送和接收方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • python回溯算法實現(xiàn)全排列小練習(xí)分享

    python回溯算法實現(xiàn)全排列小練習(xí)分享

    這篇文章主要給大家分享的是python回溯算法實現(xiàn)全排列小練習(xí),文章根據(jù)例子:輸入列表L(不含重復(fù)元素),輸出L的全排列展開學(xué)習(xí),需要的小伙伴可以參考一下
    2022-02-02
  • python 批量壓縮圖片的腳本

    python 批量壓縮圖片的腳本

    用Python編寫的批量壓縮圖片的腳本,可以自定義壓縮質(zhì)量,有批量圖片壓縮需求的朋友可以直接拿來用
    2021-06-06
  • numpy降維方法

    numpy降維方法

    本文主要介紹了numpy降維方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Django多對多ManyToManyField字段的使用

    Django多對多ManyToManyField字段的使用

    Django是一個支持多對多關(guān)系的Web框架,可以在模型中定義多對多關(guān)系,本文主要介紹了Django多對多ManyToManyField字段的使用,感興趣的可以了解一下
    2023-12-12
  • 淺談Python項目的服務(wù)器部署

    淺談Python項目的服務(wù)器部署

    這篇文章主要介紹了Python項目的服務(wù)器部署,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-04-04
  • 使用Python實現(xiàn)微信提醒備忘錄功能

    使用Python實現(xiàn)微信提醒備忘錄功能

    最近工作比較繁雜,經(jīng)常忘事,有時候記了備忘錄結(jié)果卻忘記看備忘錄,但是微信是每天都會看的,于是就想到寫 一個基于微信的提醒系統(tǒng)。這篇文章主要介紹了使用Python實現(xiàn)微信提醒備忘錄功能,需要的朋友可以參考下
    2018-12-12
  • Python實現(xiàn)彈球小游戲

    Python實現(xiàn)彈球小游戲

    這篇文章主要介紹了Python實現(xiàn)彈球小游戲的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08
  • Python繪制燈籠的示例代碼

    Python繪制燈籠的示例代碼

    這篇文章主要為大家介紹了如何通過Python繪制一個燈籠,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定幫助,感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下
    2022-02-02
  • pytest實現(xiàn)測試用例參數(shù)化

    pytest實現(xiàn)測試用例參數(shù)化

    這篇文章主要介紹了pytest實現(xiàn)測試用例參數(shù)化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評論

武穴市| 临泽县| 广丰县| 衢州市| 朝阳区| 庆云县| 屏边| 曲松县| 建阳市| 阿克苏市| 新田县| 东乌| 兴宁市| 从江县| 阿鲁科尔沁旗| 寻甸| 唐海县| 科技| 马关县| 新宁县| 三原县| 乌鲁木齐市| 浦江县| 新乡县| 双城市| 略阳县| 陆丰市| 沈丘县| 山东| 临高县| 姜堰市| 崇礼县| 湘潭市| 商河县| 石屏县| 辽阳县| 广丰县| 丹棱县| 沙雅县| 南昌县| 天全县|