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

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

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

什么是Python元類?

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

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

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

Python中的類和對(duì)象

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

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

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

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

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

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

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

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

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

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

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)的類型。在下一個(gè)主題中,我們將嘗試了解元類實(shí)際上是如何工作的。

Python元類如何工作?

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

  • 類型類
  • 自定義元類

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

類型類

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

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

Output: <class '__main__.Edureka'>

print(type(Edureka))

Output: <class 'type'>

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

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

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

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

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

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

Python中的自定義元類

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

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

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

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

Python中的__call__是什么?

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

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

請(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

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

裝飾器vs元類

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

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í)修改程序的一部分而不是重寫函數(shù)或更改整個(gè)程序時(shí),這非常方便。取而代之的是,您只需編寫一個(gè)單行裝飾器,其余的就由它來(lái)處理。

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

相關(guān)文章

  • Python利用PySimpleGUI實(shí)現(xiàn)自制桌面翻譯神器

    Python利用PySimpleGUI實(shí)現(xiàn)自制桌面翻譯神器

    工作上經(jīng)常需要與外國(guó)友人郵件溝通,奈何工作電腦沒(méi)有安裝有道詞典一類的翻譯軟件,結(jié)合自己的需要,自己用PySimpleGUI擼一個(gè)桌面翻譯神器,感興趣的可以了解一下
    2022-09-09
  • Python常見(jiàn)異常分類與處理方法

    Python常見(jiàn)異常分類與處理方法

    之前在學(xué)習(xí)python的時(shí)候有整理過(guò)python異常處理的文章,不夠簡(jiǎn)單也不夠完整,所以決定再整理一篇,算做補(bǔ)充。
    2017-06-06
  • 利用Python抓取行政區(qū)劃碼的方法

    利用Python抓取行政區(qū)劃碼的方法

    做項(xiàng)目的時(shí)候會(huì)需要用到各個(gè)行政區(qū)劃的代碼,最近就碰巧遇到有這個(gè)需求,于是就上網(wǎng)搜了一下,測(cè)試后分享給大家,這篇文章就給大家分享了利用Python抓取行政區(qū)劃碼的示例代碼,有需要的朋友們可以參考借鑒,下面跟著小編一起去學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11
  • Python?TypeError:?‘float‘?object?is?not?subscriptable錯(cuò)誤解決

    Python?TypeError:?‘float‘?object?is?not?subscriptable錯(cuò)

    發(fā)現(xiàn)問(wèn)題寫python的時(shí)候出現(xiàn)了這個(gè)錯(cuò),所以想著給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于Python?TypeError:?‘float‘?object?is?not?subscriptable錯(cuò)誤的解決辦法,需要的朋友可以參考下
    2022-12-12
  • python基礎(chǔ)知識(shí)之索引與切片詳解

    python基礎(chǔ)知識(shí)之索引與切片詳解

    在python的學(xué)習(xí)過(guò)程,有些同學(xué)對(duì)索引和切換會(huì)感到困惑,今天我們就來(lái)弄清楚它,下面這篇文章主要給大家介紹了關(guān)于python基礎(chǔ)知識(shí)之索引與切片的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • python中is與雙等于號(hào)“==”的區(qū)別示例詳解

    python中is與雙等于號(hào)“==”的區(qū)別示例詳解

    Python中有很多運(yùn)算符,下面這篇文章主要給大家介紹了關(guān)于python中is與雙等于號(hào)“==”區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Python自動(dòng)掃碼支付的實(shí)現(xiàn)示例

    Python自動(dòng)掃碼支付的實(shí)現(xiàn)示例

    本文主要介紹了Python自動(dòng)掃碼支付的實(shí)現(xiàn)示例,包括二維碼識(shí)別、自動(dòng)填寫支付信息、自動(dòng)點(diǎn)擊支付等過(guò)程,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • 在Python中處理XML的教程

    在Python中處理XML的教程

    這篇文章主要介紹了在Python中處理XML的教程,是Python網(wǎng)絡(luò)編程中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-04-04
  • Django批量覆蓋更新實(shí)現(xiàn)示例

    Django批量覆蓋更新實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了Django批量覆蓋更新實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Python  OpenCV實(shí)現(xiàn)攝像頭人臉識(shí)別功能

    Python  OpenCV實(shí)現(xiàn)攝像頭人臉識(shí)別功能

    這篇文章主要介紹了Python  OpenCV實(shí)現(xiàn)攝像頭人臉識(shí)別,使用Python 3和OpenCV進(jìn)行攝像頭人臉識(shí)別的基本步驟,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07

最新評(píng)論

阿巴嘎旗| 贵定县| 通州市| 潢川县| 外汇| 乌兰浩特市| 吉林市| 建水县| 石景山区| 高安市| 营山县| 龙陵县| 白河县| 瓮安县| 营口市| 甘德县| 舞钢市| 沂源县| 沧州市| 宁波市| 出国| 修文县| 二手房| 武平县| 葫芦岛市| 花垣县| 南汇区| 梁山县| 开原市| 武乡县| 宜阳县| 石棉县| 澳门| 青田县| 安泽县| 万安县| 娄烦县| 松阳县| 阳春市| 哈巴河县| 江永县|