types --- 動態類型創建和內置類型名稱?
源代碼: Lib/types.py
此模塊定義了一些工具函數,用于協助動態創建新的類型。
它還為某些對象類型定義了名稱,這些名稱由標準 Python 解釋器所使用,但并不像內置的 int 或 str 那樣對外公開。
最后,它還額外提供了一些類型相關但重要程度不足以作為內置對象的工具類和函數。
動態類型創建?
-
types.new_class(name, bases=(), kwds=None, exec_body=None)? 使用適當的元類動態地創建一個類對象。
前三個參數是組成類定義頭的部件:類名稱,基類 (有序排列),關鍵字參數 (例如
metaclass)。exec_body 參數是一個回調函數,用于填充新創建類的命名空間。 它應當接受類命名空間作為其唯一的參數并使用類內容直接更新命名空間。 如果未提供回調函數,則它就等效于傳入
lambda ns: ns。3.3 新版功能.
-
types.prepare_class(name, bases=(), kwds=None)? 計算適當的元類并創建類命名空間。
參數是組成類定義頭的部件:類名稱,基類 (有序排列) 以及關鍵字參數 (例如
metaclass)。返回值是一個 3 元組:
metaclass, namespace, kwdsmetaclass 是適當的元類,namespace 是預備好的類命名空間而 kwds 是所傳入 kwds 參數移除每個
'metaclass'條目后的已更新副本。 如果未傳入 kwds 參數,這將為一個空字典。3.3 新版功能.
在 3.6 版更改: 所返回元組中
namespace元素的默認值已被改變。 現在當元類沒有__prepare__方法時將會使用一個保留插入順序的映射。
-
types.resolve_bases(bases)? 動態地解析 MRO 條目,具體描述見 PEP 560。
此函數會在 bases 中查找不是
type的實例的項,并返回一個元組,其中每個具有__mro_entries__方法的此種對象對象將被替換為調用該方法解包后的結果。 如果一個 bases 項是type的實例,或它不具有__mro_entries__方法,則它將不加改變地被包含在返回的元組中。3.7 新版功能.
參見
PEP 560 - 對 typing 模塊和泛型類型的核心支持
標準解釋器類型?
此模塊為許多類型提供了實現 Python 解釋器所要求的名稱。 它刻意地避免了包含某些僅在處理過程中偶然出現的類型,例如 listiterator 類型。
此種名稱的典型應用如 isinstance() 或 issubclass() 檢測。
以下類型有相應的標準名稱定義:
-
types.AsyncGeneratorType? asynchronous generator 迭代器對象的類型,由異步生成器函數創建。
3.6 新版功能.
-
types.MethodType? 用戶自定義類實例方法的類型。
-
types.BuiltinFunctionType? -
types.BuiltinMethodType? 內置函數例如
len()或sys.exit()以及內置類方法的類型。 (這里所說的“內置”是指“以 C 語言編寫”。)
-
types.WrapperDescriptorType? 某些內置數據類型和基類的方法的類型,例如
object.__init__()或object.__lt__()。3.7 新版功能.
-
types.MethodWrapperType? 某些內置數據類型和基類的 綁定 方法的類型。 例如
object().__str__所屬的類型。3.7 新版功能.
-
types.MethodDescriptorType? 某些內置數據類型方法的類型例如
str.join()。3.7 新版功能.
-
types.ClassMethodDescriptorType? 某些內置數據類型 非綁定 類方法例如
dict.__dict__['fromkeys']的類型。3.7 新版功能.
-
class
types.ModuleType(name, doc=None)? 模塊 的類型。 構造器接受待創建模塊的名稱及其作為可選項 docstring。
注解
如果你希望設置各種由導入控制的屬性,請使用
importlib.util.module_from_spec()來創建一個新模塊。-
__name__? 模塊的名稱。
-
-
class
types.TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno)? 回溯對象的類型,例如
sys.exc_info()[2]中的對象。請查看 語言參考 了解可用屬性和操作的細節,以及動態地創建回溯對象的指南。
-
types.GetSetDescriptorType? 使用
PyGetSetDef在擴展模塊中定義的對象的類型,例如FrameType.f_locals或array.array.typecode。 此類型被用作對象屬性的描述器;它的目的與property類型相同,但專門針對在擴展模塊中定義的類。
-
types.MemberDescriptorType? 使用
PyMemberDef在擴展模塊中定義的對象的類型,例如datetime.timedelta.days。 此類型被用作使用標準轉換函數的簡單 C 數據成員的描述器;它的目的與property類型相同,但專門針對在擴展模塊中定義的類。CPython implementation detail: 在 Python 的其它實現中,此類型可能與
GetSetDescriptorType完全相同。
-
class
types.MappingProxyType(mapping)? 一個映射的只讀代理。 它提供了對映射條目的動態視圖,這意味著當映射發生改變時,視圖會反映這些改變。
3.3 新版功能.
-
key in proxy 如果下層的映射中存在鍵 key 則返回
True,否則返回False。
-
proxy[key] 返回下層的映射中以 key 為鍵的項。 如果下層的映射中不存在鍵 key 則引發
KeyError。
-
iter(proxy) 返回由下層映射的鍵為元素的迭代器。 這是
iter(proxy.keys())的快捷方式。
-
len(proxy) 返回下層映射中的項數。
-
copy()? 返回下層映射的淺拷貝。
-
get(key[, default])? 如果 key 存在于下層映射中則返回 key 的值,否則返回 default。 如果 default 未給出則默認為
None,因而此方法絕不會引發KeyError。
-
items()? 返回由下層映射項 (
(鍵, 值)對) 組成的一個新視圖。
-
keys()? 返回由下層映射的鍵組成的一個新視圖。
-
values()? 返回由下層映射的值組成的一個新視圖。
-
附加工具類和函數?
-
class
types.SimpleNamespace? 一個簡單的
object子類,提供了訪問其命名空間的屬性,以及一個有意義的 repr。不同于
object,對于SimpleNamespace你可以添加和移除屬性。 如果一個SimpleNamespace對象使用關鍵字參數進行初始化,這些參數會被直接加入下層命名空間。此類型大致等價于以下代碼:
class SimpleNamespace: def __init__(self, **kwargs): self.__dict__.update(kwargs) def __repr__(self): keys = sorted(self.__dict__) items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys) return "{}({})".format(type(self).__name__, ", ".join(items)) def __eq__(self, other): return self.__dict__ == other.__dict__
SimpleNamespace可被用于替代class NS: pass。 但是,對于結構化記錄類型則應改用namedtuple()。3.3 新版功能.
-
types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)? 在類上訪問 __getattr__ 的路由屬性。
這是一個描述器,用于定義通過實例與通過類訪問時具有不同行為的屬性。 當實例訪問時保持正常行為,但當類訪問屬性時將被路由至類的 __getattr__ 方法;這是通過引發 AttributeError 來完成的。
這樣就允許有在實例上激活的特征屬性,同時又有在類上的同名虛擬屬性(一個這樣的例子是 Enum)。
3.4 新版功能.
協程工具函數?
-
types.coroutine(gen_func)? 此函數可將 generator 函數轉換為返回基于生成器的協程的 coroutine function。 基于生成器的協程仍然屬于 generator iterator,但同時又可被視為 coroutine 對象兼 awaitable。 不過,它沒有必要實現
__await__()方法。如果 gen_func 是一個生成器函數,它將被原地修改。
如果 gen_func 不是一個生成器函數,則它會被包裝。 如果它返回一個
collections.abc.Generator的實例,該實例將被包裝在一個 awaitable 代理對象中。 所有其他對象類型將被原樣返回。3.5 新版功能.
