亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么理解Python的元類

發布時間:2021-11-26 17:57:06 來源:億速云 閱讀:113 作者:iii 欄目:開發技術

本篇內容介紹了“怎么理解Python的元類”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

什么是元類

Python中,一切皆對象,我們定義的數字、字符串、函數、列表等都是對象,對象是類(class)的是實例,而類(class)其實也是對象,是type的實例。這個type就是Python中的元類metaclass)。所謂元類就是用于創建所有類型的類,Python中的所有新式類以及Python3中的所有類都是type元類的實例。我們看下面這個例子:

print(type(0))  # <class 'int'>
print(type(int))  # <class 'type'>
print(type("tigeriaf"))  # <class 'str'>
print(type(str))  # <class 'type'>
print(type([1, 2, 3]))  # <class 'list'>
print(type(list))  #  <class 'type'>
class User:
    pass
u = User()
print(type(u))  # <class '__main__.User'>
print(type(User))  # <class 'type'>
print(type(type))  # <class 'type'>

type元類動態創建類

之前我們定義類要使用class關鍵字進行創建,除了這樣我們還可以使用type動態的去創建類。

用法如下:

type(name, bases, dict),接收三個參數

  • 第一個參數name是指要創建類的名稱

  • 第二個參數bases是指需要繼承父類的元組

  • 第三個參數dict是類的屬性

例如:

class User:
    def __init__(self):
        self.name = 'tigeriaf'
print(User)
user = User()
print(user.name)
class User:
    def __init__(self):
        self.name = 'tigeriaf'
print(User)
user = User()
print(user.name)

以上兩種方式都可以創建類,輸出結果也是一樣的,可見使用type動態的去創建類也是非常方便的。

自定義元類

通過上面的例子我們知道可以使用type(name, bases, dict)來創建類,如果當使用type元類無法滿足我們的一些需求時,我們可以自定義一個元類并使用該元類去創建類嗎?答案是可以的,下面我們來看一下:

class MyMetaClass(type):
    def __init__(cls, name, bases, dict):
        super().__init__(name, bases, dict)
        cls.int_attrs = {}
        for k, v in dict.items():
            if type(v) is int:
                cls.int_attrs[k] = v
User = MyMetaClass('User', (), {'name': 'tigeriaf', "age": 24, "level": 2, "introduction": "Python全菜工程師"})
print(User)  # <class '__main__.User'>
user = User()  
print(user.name)  # tigeriaf
print(user.int_attrs)  # {'age': 24, 'level': 2}

也可以使用下面這種方法,去創建繼承元類的類。

class User(metaclass=MyMetaClass):
    pass

注意:在Python2中使用元類需要在要創建的類內對__metaclass__進行賦值,值為元類。

上述代碼定義一個類MyMetaClass,繼承自type類,因為type是元類,所以MyMetaClass也是一個元類,在__init__通過super().__init__(name, bases, dict)調用了父類type的__init__()方法,在實現自定義元類的基礎上,還在創建類的時候把屬性循環了一遍,然后值為int類型的屬性單獨存了起來。這樣我們就實現了比type元類更定制化的元類了,我們可以隨意在元類內添加我們想要的功能。

“怎么理解Python的元類”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

威海市| 昆明市| 开平市| 汉寿县| 柘城县| 鸡东县| 勃利县| 兰坪| 张家界市| 泰来县| 若尔盖县| 东光县| 祁门县| 襄樊市| 宁明县| 静乐县| 额尔古纳市| 临澧县| 高邑县| 凤山市| 台南县| 南江县| 大渡口区| 泸溪县| 渑池县| 鸡东县| 金秀| 马山县| 安福县| 滦南县| 通城县| 镇沅| 武城县| 崇文区| 镇康县| 内黄县| 灵石县| 渑池县| 会泽县| 铜川市| 湟源县|