types – 动态类型创建和内置类型的名称(38)Python语言(必读进阶学习教程)(参考资料)
该模块定义实用函数以协助动态创建新类型。
它还为标准 Python 解释器使用的某些对象类型定义名称,但不会像 int 或 str 那样作为内置函数公开。
最后,它提供了一些额外的与类型相关的实用程序类和函数,这些类和函数的基础不足以成为内置函数。
动态类型创建
types.
new_class
(name, bases=(), kwds=None, exec_body=None)- 使用适当的元类动态创建类对象。
前三个参数是构成类定义头的组件:类名、基类(按顺序)、关键字参数(例如元类)。
exec_body 参数是一个回调,用于填充新创建的类命名空间。 它应该接受类命名空间作为其唯一参数,并直接使用类内容更新命名空间。 如果不提供回调,则与传入 lambda ns: ns 的效果相同。
3.3 版中的新功能。
nametypes.
prepare_class
(
bases=(),
kwds=None,
)
- 计算适当的元类并创建类命名空间。
参数是构成类定义头的组件:类名、基类(按顺序)和关键字参数(例如元类)。
返回值是一个三元组:元类、命名空间、kwds
元类是适当的元类,命名空间是准备好的类命名空间,kwds 是传入的 kwds 参数的更新副本,删除了任何“元类”条目。 如果没有传入 kwds 参数,这将是一个空字典。
3.3 版中的新功能。
在 3.6 版更改:返回元组的命名空间元素的默认值已更改。 现在,当元类没有 __prepare__ 方法时,将使用保留插入顺序的映射。
types.
resolve_bases
(bases)- 按照 PEP 560 的规定动态解析 MRO 条目。
此函数在不是类型实例的基类中查找项目,并返回一个元组,其中每个具有 __mro_entries__ 方法的此类对象都替换为调用此方法的解压缩结果。 如果基础项是类型的实例,或者它没有 __mro_entries__ 方法,那么它会原封不动地包含在返回元组中。
3.7 版中的新功能。
也可以看看
PEP 560 – 对类型模块和通用类型的核心支持
标准解释器类型
该模块为实现 Python 解释器所需的许多类型提供了名称。 它有意避免包含一些仅在处理过程中偶然出现的类型,例如 listiterator 类型。
这些名称的典型用途是用于 isinstance() 或 issubclass() 检查。
为以下类型定义了标准名称:
types.
FunctionType
types.
LambdaType
lambda 表达式创建的用户定义函数和函数的类型。
types.
GeneratorType
- 由生成器函数创建的生成器迭代器对象的类型。
types.
CoroutineType
- 协程对象的类型,由 async def 函数创建。
3.5 版中的新功能。
types.
AsyncGeneratorType
- 由异步生成器函数创建的异步生成器迭代器对象的类型。
3.6 版中的新功能。
types.
CodeType
-
代码对象的类型,例如 compile() 返回的类型。
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) - 模块的类型。 构造函数采用要创建的模块的名称和可选的文档字符串。
注意
如果您希望设置各种导入控制的属性,请使用 importlib.util.module_from_spec() 创建一个新模块。
__doc__
- 模块的docstring。默认为
None
。
__loader__
- 加载模块的加载程序。 默认为
None
。在版本3.4中更改:默认为
None
。以前该属性是可选的。
__name__
- 模块的名称。
__package__
- 模块属于哪个包。 如果模块是顶级模块(即不是任何特定包的一部分),则该属性应设置为“”,否则应设置为包的名称(如果模块本身是包,则可以是 __name__ ). 默认为
None
。在 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。 此类型用作对象属性的描述符; 它与属性类型具有相同的用途,但用于扩展模块中定义的类。
types.
MemberDescriptorType
- 使用 PyMemberDef 在扩展模块中定义的对象类型,例如 datetime.timedelta.days。 此类型用作使用标准转换函数的简单 C 数据成员的描述符; 它与属性类型具有相同的用途,但用于扩展模块中定义的类。
CPython 实现细节:在 Python 的其他实现中,此类型可能与 GetSetDescriptorType 相同。
- 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])- 如果键在底层映射中,则返回键的值,否则返回默认值。 如果未给出默认值,则默认为 None,因此此方法永远不会引发 KeyError。
items
()- 返回底层映射项((键,值)对)的新视图。
keys
()- 返回底层映射键的新视图。
values
()- 返回底层映射值的新视图。
其他实用程序类和函数
- class
types.
SimpleNamespace
- 一个简单的对象子类,提供对其命名空间的属性访问,以及有意义的 repr。
与对象不同,使用 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 可用作 NS:pass 类的替代品。 但是,对于结构化记录类型,请改用 namedtuple() 。
3.3 版中的新功能。
fget=Nonetypes.
DynamicClassAttribute
(
fset=None,
fdel=None,
doc=None,
)
- 将类的属性访问路由到 __getattr__。
这是一个描述符,用于定义在通过实例和类访问时行为不同的属性。 实例访问保持正常,但通过类访问属性将被路由到类的 __getattr__ 方法; 这是通过引发 AttributeError 来完成的。
这允许一个人在实例上激活属性,并在类上具有相同名称的虚拟属性(请参见枚举示例)。
3.4 版中的新功能。
协程实用功能
types.
coroutine
(gen_func)- 此函数将生成器函数转换为协程函数,后者返回基于生成器的协程。 基于生成器的协程仍然是一个生成器迭代器,但也被认为是协程对象并且是可等待的。 但是,它不一定要实现 __await__() 方法。
如果 gen_func 是一个生成器函数,它将被就地修改。
如果 gen_func 不是生成器函数,它将被包装。 如果它返回 collections.abc.Generator 的一个实例,该实例将被包装在一个可等待的代理对象中。 所有其他类型的对象将按原样返回。
3.5 版中的新功能。