W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
你想定義一個(gè)元類,允許類定義時(shí)提供可選參數(shù),這樣可以控制或配置類型的創(chuàng)建過(guò)程。
在定義類的時(shí)候,Python允許我們使用 ``metaclass``關(guān)鍵字參數(shù)來(lái)指定特定的元類。例如使用抽象基類:
from abc import ABCMeta, abstractmethod
class IStream(metaclass=ABCMeta):
@abstractmethod
def read(self, maxsize=None):
pass
@abstractmethod
def write(self, data):
pass
然而,在自定義元類中我們還可以提供其他的關(guān)鍵字參數(shù),如下所示:
class Spam(metaclass=MyMeta, debug=True, synchronize=True):
pass
為了使元類支持這些關(guān)鍵字參數(shù),你必須確保在 __prepare__()
, __new__()
和 __init__()
方法中都使用強(qiáng)制關(guān)鍵字參數(shù)。就像下面這樣:
class MyMeta(type):
# Optional
@classmethod
def __prepare__(cls, name, bases, *, debug=False, synchronize=False):
# Custom processing
pass
return super().__prepare__(name, bases)
# Required
def __new__(cls, name, bases, ns, *, debug=False, synchronize=False):
# Custom processing
pass
return super().__new__(cls, name, bases, ns)
# Required
def __init__(self, name, bases, ns, *, debug=False, synchronize=False):
# Custom processing
pass
super().__init__(name, bases, ns)
給一個(gè)元類添加可選關(guān)鍵字參數(shù)需要你完全弄懂類創(chuàng)建的所有步驟,因?yàn)檫@些參數(shù)會(huì)被傳遞給每一個(gè)相關(guān)的方法。__prepare__()
方法在所有類定義開始執(zhí)行前首先被調(diào)用,用來(lái)創(chuàng)建類命名空間。通常來(lái)講,這個(gè)方法只是簡(jiǎn)單的返回一個(gè)字典或其他映射對(duì)象。__new__()
方法被用來(lái)實(shí)例化最終的類對(duì)象。它在類的主體被執(zhí)行完后開始執(zhí)行。__init__()
方法最后被調(diào)用,用來(lái)執(zhí)行其他的一些初始化工作。
當(dāng)我們構(gòu)造元類的時(shí)候,通常只需要定義一個(gè) __new__()
或 __init__()
方法,但不是兩個(gè)都定義。但是,如果需要接受其他的關(guān)鍵字參數(shù)的話,這兩個(gè)方法就要同時(shí)提供,并且都要提供對(duì)應(yīng)的參數(shù)簽名。默認(rèn)的 __prepare__()
方法接受任意的關(guān)鍵字參數(shù),但是會(huì)忽略它們,所以只有當(dāng)這些額外的參數(shù)可能會(huì)影響到類命名空間的創(chuàng)建時(shí)你才需要去定義 __prepare__()
方法。
通過(guò)使用強(qiáng)制關(guān)鍵字參數(shù),在類的創(chuàng)建過(guò)程中我們必須通過(guò)關(guān)鍵字來(lái)指定這些參數(shù)。
使用關(guān)鍵字參數(shù)配置一個(gè)元類還可以視作對(duì)類變量的一種替代方式。例如:
class Spam(metaclass=MyMeta):
debug = True
synchronize = True
pass
將這些屬性定義為參數(shù)的好處在于它們不會(huì)污染類的名稱空間,這些屬性僅僅只從屬于類的創(chuàng)建階段,而不是類中的語(yǔ)句執(zhí)行階段。另外,它們?cè)?__prepare__()
方法中是可以被訪問(wèn)的,因?yàn)檫@個(gè)方法會(huì)在所有類主體執(zhí)行前被執(zhí)行。但是類變量只能在元類的 __new__()
和 __init__()
方法中可見(jiàn)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: