python中可选参数是什么意思_Python如何定义有可选参数的元类
問(wèn)題
你想定義一個(gè)元類(lèi),允許類(lèi)定義時(shí)提供可選參數(shù),這樣可以控制或配置類(lèi)型的創(chuàng)建過(guò)程。
解決方案
在定義類(lèi)的時(shí)候,Python允許我們使用 ``metaclass``關(guān)鍵字參數(shù)來(lái)指定特定的元類(lèi)。 例如使用抽象基類(lèi):
from abc import ABCMeta, abstractmethod
class IStream(metaclass=ABCMeta):
@abstractmethod
def read(self, maxsize=None):
pass
@abstractmethod
def write(self, data):
pass
然而,在自定義元類(lèi)中我們還可以提供其他的關(guān)鍵字參數(shù),如下所示:
class Spam(metaclass=MyMeta, debug=True, synchronize=True):
pass
為了使元類(lèi)支持這些關(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è)元類(lèi)添加可選關(guān)鍵字參數(shù)需要你完全弄懂類(lèi)創(chuàng)建的所有步驟, 因?yàn)檫@些參數(shù)會(huì)被傳遞給每一個(gè)相關(guān)的方法。 __prepare__()方法在所有類(lèi)定義開(kāi)始執(zhí)行前首先被調(diào)用,用來(lái)創(chuàng)建類(lèi)命名空間。 通常來(lái)講,這個(gè)方法只是簡(jiǎn)單的返回一個(gè)字典或其他映射對(duì)象。 __new__()方法被用來(lái)實(shí)例化最終的類(lèi)對(duì)象。它在類(lèi)的主體被執(zhí)行完后開(kāi)始執(zhí)行。 __init__()方法最后被調(diào)用,用來(lái)執(zhí)行其他的一些初始化工作。
當(dāng)我們構(gòu)造元類(lèi)的時(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ì)影響到類(lèi)命名空間的創(chuàng)建時(shí)你才需要去定義 __prepare__()方法。
通過(guò)使用強(qiáng)制關(guān)鍵字參數(shù),在類(lèi)的創(chuàng)建過(guò)程中我們必須通過(guò)關(guān)鍵字來(lái)指定這些參數(shù)。
使用關(guān)鍵字參數(shù)配置一個(gè)元類(lèi)還可以視作對(duì)類(lèi)變量的一種替代方式。例如:
class Spam(metaclass=MyMeta):
debug = True
synchronize = True
pass
將這些屬性定義為參數(shù)的好處在于它們不會(huì)污染類(lèi)的名稱(chēng)空間, 這些屬性僅僅只從屬于類(lèi)的創(chuàng)建階段,而不是類(lèi)中的語(yǔ)句執(zhí)行階段。 另外,它們?cè)?__prepare__()方法中是可以被訪問(wèn)的,因?yàn)檫@個(gè)方法會(huì)在所有類(lèi)主體執(zhí)行前被執(zhí)行。 但是類(lèi)變量只能在元類(lèi)的 __new__() 和 __init__()方法中可見(jiàn)。
以上就是Python如何定義有可選參數(shù)的元類(lèi)的詳細(xì)內(nèi)容,更多關(guān)于Python定義元類(lèi)的資料請(qǐng)關(guān)注我們其它相關(guān)文章!
本文標(biāo)題: Python如何定義有可選參數(shù)的元類(lèi)
本文地址: http://www.cppcns.com/jiaoben/python/329069.html
總結(jié)
以上是生活随笔為你收集整理的python中可选参数是什么意思_Python如何定义有可选参数的元类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 最大的ddos攻击(最好的ddos攻击)
- 下一篇: python发送邮件outlook_通过