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

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

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

源代码: :source:`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)。

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

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

3.3 版中的新功能。

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

也可以看看

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


8.9.2. 标准解释器类型

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

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

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

types.FunctionType

types.LambdaType

lambda 表达式创建的用户定义函数和函数的类型。
types.GeneratorType
generator-iterator 对象的类型,由生成器函数创建。
types.CoroutineType

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

3.5 版中的新功能。

types.AsyncGeneratorType

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

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__

模块的 文档字符串 。 默认为 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 类型具有相同的用途,但用于扩展模块中定义的类。
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()

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


8.9.3. 附加实用程序类和函数

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):
        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 版中的新功能。


8.9.4. 协程效用函数

types.coroutine(gen_func)

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

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

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

3.5 版中的新功能。