Python如何定義有可選引數的元類

2022-10-04 13:45:44 字數 1913 閱讀 6225

問題

你想定義乙個元類,允許類定義時提供可選引數,這樣可以控制或配置型別的建立過程。

解決方案

在定義類的時候,python允許我們使用 ``metaclass``關鍵字引數來指定特定的元類。 www.cppcns.com例如使用抽象基類:

from abc import abcmeta, abstractmethod

class istream(metaclass=abcmeta):

@abstractmethod

def read(self, maxsize=none):

pass

@abstractmethod

def write(self, data):

pass

然而,在自定義元類中我們還可以提供其他的關鍵字引數,如下所示:

class spam(metaclass=mymeta, debug=true, synchronize=true):

pass

為了使元類支援這些關鍵字引數,你必須確保在__prepare__(),__new__()和__init__()方法中 都使用強制關鍵字引數。就像下面這樣:

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)

討論給乙個元類新增可選關鍵字引數需要你完全弄懂類建立的所有步驟, 因為這些引數會被傳遞給每乙個相關的方法。__prepare__()方法在所有類定義開始執行前首先被呼叫,用來建立類命名空間。 通常來講,這個方法只是簡單的返回乙個字典或其他對映物件。__new__()方法被用來例項化最終的類物件。它在類的主體被執行完後開始執行。__init__()方法最後被呼叫,用來執行其他的一些初始化工作。

當我們構造元類的時候,通常只需要定義乙個__new__()或__init__()方法,但不是兩個都定義。 但是,如果需要接受其他的程式設計客棧關鍵字引數的話,這兩個方法就要同時提供,並且都要提供對應的引數簽名。 預設的__prepare__()方法接受任意的關鍵字引數,但是會忽略它們, 所以只有當這些額外的引數可能會影響到類命名空間的建立時你才需要去定義__prepare__()方法。

通過使用強制關鍵字引數,在類的建立過程中我程式設計客棧們必須通過關鍵字來指定這些引數。

使用關鍵字引數配置乙個元類還可以視作對類變數的一種替代方式。例如:

class spam(metaclass=mymeta):

debug = true

synchronize = true

pass

將這些屬性定義為引數的好處在於它們不會汙染類的命名空間, 這些屬性僅僅只從屬於類的建立階段,而不是類中的語句執行階段。 另外,它們在__prepare__()方法中是可以被訪問的,因為這個方法會在所有類主體執行前被執行。 但是類變數只能在元類的__new__()和__init__()方法中可見。

python中非可選引數 Python可選引數

為了有效地使用預設值,您需要了解預設值是如何工作的。函式是物件。因此,它們具有屬性。所以,如果我建立這個函式 def f x,y return y 我建立了乙個物件。其特點如下 dir f call class closure code defaults delattr dict doc forma...

Decorator裝飾器定義可選引數

一般帶引數裝飾器。使用裝飾器時需要加上括號 logged logged將會提示引數錯誤。import logging logging.basicconfig level logging.debug deflogged level logging.info defdecorator func def ...

python中使用可選引數和命名引數

info 函式就是這樣乙個例子,它有兩個可選引數。def info object,spacing 10,collapse 1 spacing 和 collapse 是可選引數,因為它們已經定義了預設值。object 是必備引數,因為它沒有指定預設值。如果呼叫 info 時只指定乙個引數,那麼 spa...