types — 内置类型的动态类型创建和名称 — Python 文档

来自菜鸟教程
Python/docs/3.8/library/types
跳转至:导航、​搜索

types — 内置类型的动态类型创建和名称

源代码: :source:`Lib/types.py`



该模块定义了实用函数来帮助动态创建新类型。

它还定义了标准 Python 解释器使用的某些对象类型的名称,但不会像 int 或 str 这样的内置函数公开。

最后,它提供了一些额外的与类型相关的实用程序类和函数,这些类和函数不够基本,不能成为内置函数。

动态类型创建

types.new_class(name, bases=(), kwds=None, exec_body=None)

使用适当的元类动态创建类对象。

前三个参数是组成类定义头的组件:类名、基类(按顺序)、关键字参数(例如 metaclass)。

exec_body 参数是一个回调,用于填充新创建的类命名空间。 它应该接受类命名空间作为其唯一参数,并直接使用类内容更新命名空间。 如果不提供回调,则与传入 lambda ns: None 的效果相同。

3.3 版中的新功能。

types.prepare_class(name, bases=(), kwds=None)

计算适当的元类并创建类命名空间。

参数是组成类定义头的组件:类名、基类(按顺序)和关键字参数(例如 metaclass)。

返回值是一个三元组:metaclass, namespace, kwds

metaclass 是适当的元类,namespace 是准备好的类命名空间,kwds 是传入的 kwds 参数的更新副本'metaclass' 条目已删除。 如果没有 kwds 参数传入,这将是一个空字典。

3.3 版中的新功能。

3.6 版更改: 返回元组的 namespace 元素的默认值已更改。 现在,当元类没有 __prepare__ 方法时,将使用保留插入顺序的映射。

也可以看看

元类
这些函数支持的类创建过程的完整细节
PEP 3115 - Python 3000 中的元类
引入了 __prepare__ 命名空间挂钩


types.resolve_bases(bases)

按照 PEP 560 的规定动态解析 MRO 条目。

此函数在 bases 中查找不是 type 实例的项目,并返回一个元组,其中每个具有 __mro_entries__ 方法的此类对象都被解包结果替换调用这个方法。 如果一个 bases 项是 type 的实例,或者它没有 __mro_entries__ 方法,那么它被包含在返回元组中不变。

3.7 版中的新功能。

也可以看看

PEP 560 - 对输入模块和泛型类型的核心支持


标准解释器类型

该模块为实现 Python 解释器所需的许多类型提供名称。 它故意避免包含一些仅在处理过程中偶然出现的类型,例如 listiterator 类型。

这些名称的典型用途是用于 isinstance() 或 issubclass() 检查。

如果您实例化任何这些类型,请注意签名可能因 Python 版本而异。

为以下类型定义了标准名称:

types.FunctionType
types.LambdaType

lambda 表达式创建的用户定义函数和函数的类型。

审计事件仅在函数对象的直接实例化时发生,在正常编译时不会引发。

types.GeneratorType
generator-iterator 对象的类型,由生成器函数创建。
types.CoroutineType

coroutine 对象的类型,由 async def 函数创建。

3.5 版中的新功能。

types.AsyncGeneratorType

异步生成器-迭代器对象的类型,由异步生成器函数创建。

3.6 版中的新功能。

class types.CodeType(**kwargs)

代码对象的类型,例如由 compile() 返回。

请注意,审计参数可能与初始值设定项所需的名称或位置不匹配。 审计事件仅在代码对象的直接实例化时发生,在正常编译时不会引发。

replace(**kwargs)

返回具有指定字段的新值的代码对象的副本。

3.8 版中的新功能。

types.CellType

单元格对象的类型:此类对象用作函数自由变量的容器。

3.8 版中的新功能。

types.MethodType
用户自定义类实例的方法类型。
types.BuiltinFunctionType

types.BuiltinMethodType

len() 或 sys.exit() 等内置函数的类型,以及内置类的方法。 (这里,“内置”一词的意思是“用 C 编写的”。)
types.WrapperDescriptorType

一些内置数据类型和基类的方法类型,例如 object.__init__() 或 object.__lt__()。

3.7 版中的新功能。

types.MethodWrapperType

一些内置数据类型和基类的 bound 方法的类型。 例如它是object().__str__的类型。

3.7 版中的新功能。

types.MethodDescriptorType

一些内置数据类型的方法类型,例如 str.join()。

3.7 版中的新功能。

types.ClassMethodDescriptorType

unbound 一些内置数据类型如 dict.__dict__['fromkeys'] 类方法的类型。

3.7 版中的新功能。

class types.ModuleType(name, doc=None)

模块的类型。 构造函数采用要创建的模块的名称以及可选的 docstring。

笔记

如果您希望设置各种导入控制属性,请使用 importlib.util.module_from_spec() 创建一个新模块。

__doc__

模块的 文档字符串 。 默认为 None。

__loader__

加载模块的 loader。 默认为 None。

该属性用于匹配存储在 attr:__spec__ 对象中的 importlib.machinery.ModuleSpec.loader。

笔记

默认情况下,Python 的未来版本可能会停止设置此属性。 为了防止这种潜在的变化,最好从 __spec__ 属性中读取,或者如果您明确需要使用此属性,则使用 getattr(module, "__loader__", None)。

在 3.4 版更改:默认为 None。 以前该属性是可选的。

__name__

模块的名称。 预期匹配 importlib.machinery.ModuleSpec.name。

__package__

一个模块属于哪个 package。 如果模块是顶级的(即 不是任何特定包的一部分)那么属性应该设置为 ,否则它应该设置为包的名称(如果模块是包,可以是 __name__本身)。 默认为 None。

此属性用于匹配存储在 attr:__spec__ 对象中的 importlib.machinery.ModuleSpec.parent。

笔记

默认情况下,Python 的未来版本可能会停止设置此属性。 为了防止这种潜在的变化,最好从 __spec__ 属性中读取,或者如果您明确需要使用此属性,则使用 getattr(module, "__package__", None)。

在 3.4 版更改:默认为 None。 以前该属性是可选的。

__spec__

模块导入系统相关状态的记录。 预期是 importlib.machinery.ModuleSpec 的实例。

3.4 版中的新功能。

class types.TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno)

回溯对象的类型,例如在 sys.exc_info()[2] 中找到。

有关可用属性和操作的详细信息,以及有关动态创建回溯的指南,请参阅 语言参考 。

types.FrameType

如果 tb 是回溯对象,则在 tb.tb_frame 中找到的框架对象的类型。

有关可用属性和操作的详细信息,请参阅 语言参考 。

types.GetSetDescriptorType
扩展模块中定义的对象类型,带有 PyGetSetDef,例如 FrameType.f_locals 或 array.array.typecode。 该类型用作对象属性的描述符; 它与 property 类型具有相同的用途,但用于扩展模块中定义的类。
types.MemberDescriptorType
扩展模块中定义的对象类型为PyMemberDef,如datetime.timedelta.days。 此类型用作使用标准转换函数的简单 C 数据成员的描述符; 它与 property 类型具有相同的用途,但用于扩展模块中定义的类。
class types.MappingProxyType(mapping)

映射的只读代理。 它提供了映射条目的动态视图,这意味着当映射更改时,视图会反映这些更改。

3.3 版中的新功能。

key in proxy

如果底层映射具有键 键 ,则返回 True,否则返回 False。

proxy[key]

返回键为键的底层映射项。 如果 key 不在底层映射中,则引发 KeyError。

iter(proxy)

在底层映射的键上返回一个迭代器。 这是 iter(proxy.keys()) 的快捷方式。

len(proxy)

返回底层映射中的项目数。

copy()

返回底层映射的浅拷贝。

get(key[, default])

如果 key 在底层映射中,则返回 key 的值,否则返回 default。 如果未给出 default,则默认为 None,因此该方法永远不会引发 KeyError。

items()

返回底层映射项((key, value) 对)的新视图。

keys()

返回底层映射键的新视图。

values()

返回底层映射值的新视图。


附加实用程序类和函数

class types.SimpleNamespace

一个简单的 object 子类,提供对其命名空间的属性访问,以及一个有意义的代表。

与 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):
        if isinstance(self, SimpleNamespace) and isinstance(other, SimpleNamespace):
           return self.__dict__ == other.__dict__
        return NotImplemented

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 函数转换为 协程函数 ,后者返回基于生成器的协程。 基于生成器的协程仍然是一个生成器迭代器,但也被认为是一个协程对象并且是awaitable。 但是,它可能不一定实现 __await__() 方法。

如果 gen_func 是一个生成器函数,它将被就地修改。

如果 gen_func 不是生成器函数,它将被包装。 如果它返回一个 collections.abc.Generator 的实例,该实例将被包裹在一个 awaitable 代理对象中。 所有其他类型的对象将按原样返回。

3.5 版中的新功能。