Skip to main content

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

源代码: Lib/types.py


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

它还定义了一些对象类型的名称,这些对象类型由标准Python解释器使用,但不会像 intstr 一样暴露为内建。

最后,它提供了一些额外的类型相关的实用程序类和函数,这些类和函数不够内在。

8.9.1. 动态类型创建

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, kwds

metaclass 是合适的元类,namespace 是准备的类命名空间,kwdskwds 参数传递的更新副本,其中删除了任何 'metaclass' 条目。如果没有传入 kwds 参数,这将是一个空的字典。

3.3 新版功能.

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

参见

元类

这些函数支持的类创建过程的完整详细信息

PEP 3115 - Python中的元类

引入了 __prepare__ 命名空间钩子

8.9.2. 标准解释器类型

此模块为实现Python解释器所需的许多类型提供名称。它故意避免包括在处理期间偶然发生的一些类型,例如 listiterator 类型。

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

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

types.FunctionType
types.LambdaType

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

types.GeneratorType

由生成函数创建的 generator 迭代器对象的类型。

types.CoroutineType

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

3.5 新版功能.

types.AsyncGeneratorType

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

3.6 新版功能.

types.CodeType

compile() 返回的代码对象的类型。

types.MethodType

用户定义的类实例的方法类型。

types.BuiltinFunctionType
types.BuiltinMethodType

内置函数的类型如 len()sys.exit(),以及内置类的方法。 (这里,术语“内置”是指“以C编写”。)

class types.ModuleType(name, doc=None)

模块 的类型。构造函数使用要创建的模块的名称和可选的它的 docstring

注解

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

__doc__

模块的 docstring。默认为 None

__loader__

加载模块的 loader。默认为 None

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

__name__

模块的名称。

__package__

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

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

types.TracebackType

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

types.FrameType

如果 tb 是一个追溯对象,则在 tb.tb_frame 中找到的帧对象的类型。

types.GetSetDescriptorType

在具有 PyGetSetDef 的扩展模块中定义的对象类型,例如 FrameType.f_localsarray.array.typecode。此类型用作对象属性的描述符;它具有与 property 类型相同的目的,但是对于在扩展模块中定义的类。

types.MemberDescriptorType

在具有 PyMemberDef 的扩展模块中定义的对象类型,例如 datetime.timedelta.days。此类型用作使用标准转换函数的简单C数据成员的描述符;它具有与 property 类型相同的目的,但是对于在扩展模块中定义的类。

在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()

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

keys()

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

values()

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

8.9.3. 其他实用程序类和函数

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来完成的。

这允许在实例上具有活动的属性,并且在类上具有相同名称的虚拟属性(参见示例的枚举)。

3.4 新版功能.

8.9.4. Coroutine实用函数

types.coroutine(gen_func)

此函数将 generator 函数转换为返回基于生成器的协同程序的 coroutine function。基于生成器的协程仍然是 generator iterator,但也被认为是 coroutine 对象,并且是 awaitable。然而,它可能不一定实现 __await__() 方法。

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

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

3.5 新版功能.