亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解如何創(chuàng)建Python元類(lèi)

 更新時(shí)間:2021年05月21日 10:43:00   作者:華為云開(kāi)發(fā)者社區(qū)  
通過(guò)本文,將深入討論P(yáng)ython元類(lèi),其屬性,如何以及何時(shí)在Python中使用元類(lèi)。

什么是Python元類(lèi)?

Python元類(lèi)是與Python的面向?qū)ο缶幊谈拍钕嚓P(guān)的高級(jí)功能之一。它確定類(lèi)的行為,并進(jìn)一步幫助其修改。

用Python創(chuàng)建的每個(gè)類(lèi)都有一個(gè)基礎(chǔ)的Metaclass。因此,在創(chuàng)建類(lèi)時(shí),您將間接使用元類(lèi)。它隱式發(fā)生,您無(wú)需指定任何內(nèi)容。

與元編程相關(guān)聯(lián)的元類(lèi)決定了程序?qū)ζ渥陨磉M(jìn)行操作的能力。 學(xué)習(xí)元類(lèi)可能看起來(lái)很復(fù)雜,但是讓我們先從一些類(lèi)和對(duì)象的概念入手,以便于理解。

Python中的類(lèi)和對(duì)象

類(lèi)是一個(gè)藍(lán)圖,是具有對(duì)象的邏輯實(shí)體。 一個(gè)簡(jiǎn)單的類(lèi)在聲明時(shí)沒(méi)有分配任何內(nèi)存,它是在創(chuàng)建一個(gè)類(lèi)的實(shí)例時(shí)發(fā)生的。

通過(guò)創(chuàng)建的對(duì)象,可以訪問(wèn)該類(lèi)。該類(lèi)僅用作模板。對(duì)象的屬性本質(zhì)上意味著我們可以在運(yùn)行時(shí)與它進(jìn)行交互,傳遞諸如變量之類(lèi)的參數(shù),進(jìn)行存儲(chǔ),修改,也可以與它進(jìn)行交互。

可以使用__class__屬性檢查對(duì)象的類(lèi)。讓我們看一個(gè)簡(jiǎn)單的例子:

class Demo: 
       pass       
#This is a class named demo
 test=Demo()
print(test.__class__)  #shows class of obj
print(type(test))  #alternate method

Output: <class '__main__.Demo'>

Python大量處理類(lèi)和對(duì)象的概念,并允許輕松,順利地進(jìn)行應(yīng)用程序開(kāi)發(fā)。但是,什么使Python與Java和C這樣的語(yǔ)言不同呢?Python中的所有內(nèi)容都可以定義為具有屬性和方法的對(duì)象。主題演講是Python中的類(lèi)不過(guò)是更大類(lèi)的另一個(gè)對(duì)象。

類(lèi)為對(duì)象定義規(guī)則。同樣,元類(lèi)負(fù)責(zé)為類(lèi)分配行為。我們已經(jīng)知道,類(lèi)是對(duì)象,就像每個(gè)對(duì)象都有一個(gè)實(shí)例一樣,類(lèi)是元類(lèi)的實(shí)例。

但是也有像Ruby和Objective-C這樣的語(yǔ)言也支持元類(lèi)。那么,是什么使Python Metaclass更好,為什么還要學(xué)習(xí)它呢?答案是Python中的動(dòng)態(tài)類(lèi)。讓我們仔細(xì)看看。

Python中的動(dòng)態(tài)類(lèi)

Python是一種動(dòng)態(tài)編程語(yǔ)言,并允許在運(yùn)行時(shí)創(chuàng)建類(lèi)。與C ++等其他語(yǔ)言不同,后者僅允許在編譯時(shí)創(chuàng)建類(lèi)。在靈活性方面,Python優(yōu)于其他靜態(tài)類(lèi)型的語(yǔ)言。

動(dòng)態(tài)和靜態(tài)類(lèi)型語(yǔ)言之間的差異并不大, 但是在Python中,它由于提供元編程而變得更加有用。

但是,如果我告訴您還有另一個(gè)關(guān)鍵功能將Python與其他編程語(yǔ)言區(qū)分開(kāi)呢?

諸如Java或C ++之類(lèi)的語(yǔ)言具有float,char,int等數(shù)據(jù)類(lèi)型,而Python將每個(gè)變量視為對(duì)象。每個(gè)對(duì)象都屬于一個(gè)類(lèi),例如int類(lèi)或str類(lèi)。您可以使用稱(chēng)為type()的內(nèi)置函數(shù)來(lái)簡(jiǎn)單地檢查任何變量的類(lèi)。

number = 10993
print("Type associated is:", type(number))
name = "Aishwarya"
print("Type associated is:", type(name))

Output:

Type associated is: <class 'int'>

Type associated is: <class 'str'>

現(xiàn)在,您了解了Python中的所有內(nèi)容都有與之關(guān)聯(lián)的類(lèi)型。在下一個(gè)主題中,我們將嘗試了解元類(lèi)實(shí)際上是如何工作的。

Python元類(lèi)如何工作?

每當(dāng)創(chuàng)建一個(gè)類(lèi)時(shí),都會(huì)調(diào)用默認(rèn)的Metaclass類(lèi)型。 元類(lèi)包含名稱(chēng),基類(lèi)集以及與該類(lèi)關(guān)聯(lián)的屬性等信息。因此,在實(shí)例化一個(gè)類(lèi)時(shí),將調(diào)用帶有這些參數(shù)的類(lèi)??梢酝ㄟ^(guò)兩種方法創(chuàng)建元類(lèi):

  • 類(lèi)型類(lèi)
  • 自定義元類(lèi)

讓我們繼續(xù)輸入class以及如何創(chuàng)建class。

類(lèi)型類(lèi)

Python有一個(gè)稱(chēng)為type的內(nèi)置元類(lèi)。與Java或C不同,那里有主要的數(shù)據(jù)類(lèi)型。Python中的每個(gè)變量或?qū)ο蠖加幸粋€(gè)與之關(guān)聯(lián)的類(lèi)。Python使用幕后的Type類(lèi)創(chuàng)建所有類(lèi)。在上一個(gè)主題中,我們看到了如何使用type()檢查對(duì)象的類(lèi)。讓我們舉一個(gè)例子,說(shuō)明如何通過(guò)創(chuàng)建一個(gè)簡(jiǎn)單的類(lèi)來(lái)定義新類(lèi)型。

class Edureka():
obj = Edureka()
 
print(type(obj))

Output: <class '__main__.Edureka'>

print(type(Edureka))

Output: <class 'type'>

在上面的代碼中,我們有一個(gè)名為Edureka的類(lèi),以及一個(gè)關(guān)聯(lián)的對(duì)象。我們通過(guò)簡(jiǎn)單地在該類(lèi)型之后創(chuàng)建一個(gè)名為自身的類(lèi),創(chuàng)建了一個(gè)名為Edureka的新類(lèi)型。在第二個(gè)代碼中,當(dāng)我們檢查Edureka類(lèi)的類(lèi)型時(shí),其結(jié)果為“類(lèi)型”。

因此,除非另有定義,否則元類(lèi)使用類(lèi)型類(lèi)來(lái)創(chuàng)建所有其他類(lèi)。我們可以通過(guò)兩種方法訪問(wèn)Type類(lèi):

當(dāng)我們通過(guò)類(lèi)型類(lèi)傳遞參數(shù)時(shí),它使用以下語(yǔ)法。

type(__name__, __base__, attributes)
  • 名稱(chēng)是一個(gè)字符串,并帶有類(lèi)名
  • 該基礎(chǔ)是一個(gè)元組,可幫助創(chuàng)建子類(lèi)
  • 屬性是字典,并分配鍵值對(duì)

由于Python中的類(lèi)的行為與對(duì)象相似,因此可以用相同的方式更改其行為。我們可以在類(lèi)內(nèi)添加或刪除方法,類(lèi)似于對(duì)對(duì)象的處理方式。

現(xiàn)在您已經(jīng)知道Metaclass在Python中創(chuàng)建了所有其他類(lèi),并使用類(lèi)型class定義了它們的行為。但是,您一定想知道,我們還有其他方法可以創(chuàng)建元類(lèi)嗎?因此,讓我們看看如何創(chuàng)建一個(gè)自定義的元類(lèi)。

Python中的自定義元類(lèi)

現(xiàn)在我們知道并理解類(lèi)型類(lèi)如何工作。現(xiàn)在該學(xué)習(xí)如何創(chuàng)建自定義元類(lèi)了。我們可以通過(guò)執(zhí)行動(dòng)作或代碼注入來(lái)修改類(lèi)的工作。為此,我們可以在創(chuàng)建類(lèi)定義時(shí)將Metaclass作為關(guān)鍵字傳遞。另外,我們可以通過(guò)簡(jiǎn)單地繼承通過(guò)此Metaclass關(guān)鍵字實(shí)例化的類(lèi)來(lái)實(shí)現(xiàn)此目的。

在創(chuàng)建新類(lèi)時(shí),Python查找__metaclass__關(guān)鍵字。以防萬(wàn)一,如果不存在。它遵循類(lèi)型類(lèi)層次結(jié)構(gòu)。

Python在命名空間中執(zhí)行所有字典后,將調(diào)用類(lèi)型對(duì)象,后者創(chuàng)建類(lèi)的對(duì)象。我們可以使用兩種方法來(lái)創(chuàng)建自定義元類(lèi)。

class EduFirst(type):
def __new__(cls, name, base_cls, dict):
pass
class EduSecond(type):
def __init__(self, name, base_cls, dict):
pass

讓我詳細(xì)解釋這兩種方法:

  • __new __():當(dāng)用戶(hù)要在類(lèi)創(chuàng)建之前定義元組字典時(shí)使用。它返回一個(gè)類(lèi)的實(shí)例,并且很容易覆蓋/管理對(duì)象流。
  • __init __():在創(chuàng)建對(duì)象并對(duì)其進(jìn)行初始化之后調(diào)用它。

Python中的__call__是什么?

在正式的Python文檔中,__call__方法可用于定義自定義元類(lèi)。同樣,當(dāng)調(diào)用類(lèi)定義自定義行為時(shí),我們可以覆蓋__prepare__之類(lèi)的其他方法。

就像類(lèi)如何像創(chuàng)建對(duì)象的模板一樣,元類(lèi)也像類(lèi)創(chuàng)建模板一樣。因此,元類(lèi)也稱(chēng)為類(lèi)工廠。

請(qǐng)參見(jiàn)下一個(gè)示例:

class Meta(type):
def __init__(cls, name, base, dct):
cls.attribute = 200
class Test(metaclass = Meta):
pass
Test.attribute

Output: 200

元類(lèi)允許自定義類(lèi)。還有多種其他有效且簡(jiǎn)單得多的方法可以通過(guò)這些方法實(shí)現(xiàn)相同的輸出。這樣的例子之一就是使用裝飾器。

裝飾器vs元類(lèi)

Decorator是Python的一項(xiàng)流行功能,它允許您向代碼中添加更多功能。裝飾器是可調(diào)用的對(duì)象,可幫助修改現(xiàn)有的類(lèi)甚至函數(shù)。在編譯期間,部分代碼將調(diào)用并修改另一部分。此過(guò)程也稱(chēng)為元編程。

def decorator(cls):
class NewClass(cls):
attribute = 200
 return NewClass
@decorator
Class Test1:
 pass
@decorator
 
Class Test2:
 pass
Test1.attribute
 
Test2.attribute

Output: 200

Python中的Decorator是一個(gè)非常有用且功能強(qiáng)大的工具,可幫助您更改函數(shù)的行為,而無(wú)需實(shí)際更改任何代碼。 當(dāng)您要在調(diào)試時(shí)修改程序的一部分而不是重寫(xiě)函數(shù)或更改整個(gè)程序時(shí),這非常方便。取而代之的是,您只需編寫(xiě)一個(gè)單行裝飾器,其余的就由它來(lái)處理。

以上就是詳解如何創(chuàng)建Python元類(lèi)的詳細(xì)內(nèi)容,更多關(guān)于如何創(chuàng)建Python元類(lèi)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python通過(guò)調(diào)用有道翻譯api實(shí)現(xiàn)翻譯功能示例

    Python通過(guò)調(diào)用有道翻譯api實(shí)現(xiàn)翻譯功能示例

    這篇文章主要介紹了Python通過(guò)調(diào)用有道翻譯api實(shí)現(xiàn)翻譯功能,結(jié)合實(shí)例形式分析了基于Python實(shí)現(xiàn)的有道翻譯api調(diào)用相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • python爬取全國(guó)水雨情信息詳解

    python爬取全國(guó)水雨情信息詳解

    這篇文章主要為大家詳細(xì)介紹了python爬取全國(guó)水雨情信息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Pytorch實(shí)現(xiàn)LSTM案例總結(jié)學(xué)習(xí)

    Pytorch實(shí)現(xiàn)LSTM案例總結(jié)學(xué)習(xí)

    這篇文章主要介紹了Pytorch實(shí)現(xiàn)LSTM案例總結(jié)學(xué)習(xí),文章通過(guò)構(gòu)建網(wǎng)絡(luò)層、前向傳播forward()展開(kāi)主題介紹,需要的小伙吧可以參考一下
    2022-07-07
  • Qt自定義Plot實(shí)現(xiàn)曲線繪制的詳細(xì)過(guò)程

    Qt自定義Plot實(shí)現(xiàn)曲線繪制的詳細(xì)過(guò)程

    這篇文章主要介紹了Qt自定義Plot實(shí)現(xiàn)曲線繪制,包含arm觸摸屏多點(diǎn)觸控縮放(只支持兩點(diǎn)),實(shí)時(shí)曲線繪制,數(shù)據(jù)點(diǎn)根據(jù)繪制寬度優(yōu)化,跟蹤點(diǎn)數(shù)據(jù)獲取,雙坐標(biāo)等功能,需要的朋友可以參考下
    2021-11-11
  • 詳解如何使用python腳本制作生成CANdbc

    詳解如何使用python腳本制作生成CANdbc

    這篇文章主要為大家詳細(xì)介紹了如何使用python腳本制作生成CANdbc,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下
    2024-01-01
  • Pytorch中torch.nn.Softmax的dim參數(shù)用法說(shuō)明

    Pytorch中torch.nn.Softmax的dim參數(shù)用法說(shuō)明

    這篇文章主要介紹了Pytorch中torch.nn.Softmax的dim參數(shù)用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Python3基礎(chǔ)之函數(shù)用法

    Python3基礎(chǔ)之函數(shù)用法

    這篇文章主要介紹了Python3的函數(shù)用法,非常重要,需要的朋友可以參考下
    2014-08-08
  • python Socket網(wǎng)絡(luò)編程實(shí)現(xiàn)C/S模式和P2P

    python Socket網(wǎng)絡(luò)編程實(shí)現(xiàn)C/S模式和P2P

    這篇文章主要介紹了python Socket網(wǎng)絡(luò)編程實(shí)現(xiàn)C/S模式和P2P,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 15行Python代碼實(shí)現(xiàn)網(wǎng)易云熱門(mén)歌單實(shí)例教程

    15行Python代碼實(shí)現(xiàn)網(wǎng)易云熱門(mén)歌單實(shí)例教程

    這篇文章主要給大家介紹了關(guān)于利用15行Python代碼實(shí)現(xiàn)網(wǎng)易云熱門(mén)歌單的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 淺談python中真正關(guān)閉socket的方法

    淺談python中真正關(guān)閉socket的方法

    今天小編就為大家分享一篇淺談python中真正關(guān)閉socket的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12

最新評(píng)論