8.9. types — 内置类型的动态类型创建和名称 — Python 文档
8.9. 类型 — 内置类型的动态类型创建和名称
该模块定义了实用函数来帮助动态创建新类型。
它还定义了标准 Python 解释器使用的某些对象类型的名称,但不会像 int 或 str 这样的内置函数公开。
最后,它提供了一些额外的与类型相关的实用程序类和函数,这些类和函数不够基本,不能成为内置函数。
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__
方法时,使用保留插入顺序的映射,
8.9.2. 标准解释器类型
该模块为实现 Python 解释器所需的许多类型提供名称。 它故意避免包含一些仅在处理过程中偶然出现的类型,例如 listiterator
类型。
这些名称的典型用途是用于 isinstance() 或 issubclass() 检查。
为以下类型定义了标准名称:
- types.FunctionType
types.LambdaType
- lambda 表达式创建的用户定义函数和函数的类型。
- types.GeneratorType
- generator-iterator 对象的类型,由生成器函数创建。
- 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__
模块的名称。
- types.TracebackType
- 回溯对象的类型,例如在
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()
返回底层映射值的新视图。
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 版中的新功能。