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

源代码: Lib/types.py


该模块定义了 Util Function,以帮助动态创建新类型。

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

最后,它提供了一些其他的与类型相关的 Util 类和函数,这些类和函数的基础性不足以内置。

动态类型创建

  • types. new_class(* name bases =() kwds = None exec_body = None *)
    • 使用适当的元类动态创建类对象。

前三个参数是构成类定义 Headers 的组件:类名称,Base Class(按 Sequences),关键字参数(例如metaclass)。

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

版本 3.3 中的新Function。

  • types. prepare_class(* name bases =() kwds = None *)
    • 计算适当的元类并创建类名称空间。

参数是组成类定义 Headers 的组件:类名称,Base Class(按 Sequences)和关键字参数(例如metaclass)。

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

  • metaclass 是适当的元类, namespace 是准备好的类名称空间, kwds 是传入的 kwds 参数的更新副本,其中删除了'metaclass'条目。如果没有传入任何 kwds *参数,则它将为空。

版本 3.3 中的新Function。

在版本 3.6 中更改:返回的 Tuples 的namespace元素的默认值已更改。现在,当元类没有__prepare__方法时,将使用保留插入 Sequences 的 Map。

See also

  • Metaclasses

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

  • PEP 3115-Python 3000 中的元类

  • 引入了__prepare__名称空间钩子

  • types. resolve_bases(* bases *)
    • 按照 PEP 560的动态解析 MRO 条目。

此函数在* base 中查找不是type实例的项,并返回一个 Tuples,在该 Tuples 中,每个具有__mro_entries__方法的此类对象都将被调用此方法的解压缩结果替换。如果 base *项目是type的实例,或者它没有__mro_entries__方法,则该项目将不变地包含在返回 Tuples 中。

3.7 版中的新Function。

See also

PEP 560-键入模块和通用类型的核心支持

标准 Interpreter 类型

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

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

如果实例化这些类型中的任何一种,请注意,不同的 Python 版本之间的签名可能会有所不同。

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

  • types. FunctionType

  • types. LambdaType

    • 用户定义的函数的类型以及由lambda表达式创建的函数。
  • types. GeneratorType

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

3.5 版中的新Function。

  • types. AsyncGeneratorType

3.6 版的新Function。

    • class * types. CodeType(*** kwargs *)
    • 代码对象的类型,例如compile()返回。

用参数codefilenamenameargcountposonlyargcountkwonlyargcountnlocalsstacksizeflags引发auditing event code.__new__

请注意,审核的参数可能与初始化程序所需的名称或位置不匹配。

  • replace((*** kwargs *)
    • 返回代码对象的副本,其中包含指定字段的新值。

3.8 版的新Function。

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

3.8 版的新Function。

  • types. MethodType

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

  • types. BuiltinMethodType

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

3.7 版中的新Function。

  • types. MethodWrapperType
    • 一些内置数据类型和 Base Class 的* bound *方法的类型。例如,它是object().__str__的类型。

3.7 版中的新Function。

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

3.7 版中的新Function。

  • types. ClassMethodDescriptorType
    • 一些内置数据类型(例如dict.__dict__['fromkeys'])的* unbound *类方法的类型。

3.7 版中的新Function。

    • class * types. ModuleType(* name doc = None *)
    • modules的类型。构造函数采用要创建的模块的名称,也可以采用其docstring的名称。

Note

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

  • __doc__

  • __loader__

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

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

  • __name__

    • 模块的名称。
  • __package__

    • 模块属于哪个package。如果模块是顶级模块(即不是任何特定软件包的一部分),则应将属性设置为'',否则应将其设置为软件包的名称(如果模块本身是软件包,则可以为name)。 。默认为None

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

    • class * types. TracebackType(* tb_next tb_frame tb_lasti tb_lineno *)
    • traceback 对象的类型,例如sys.exc_info()[2]

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

  • types. FrameType
    • 帧对象的类型,例如tb.tb_frame(如果tb是回溯对象)。

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

  • types. GetSetDescriptorType

    • 在扩展模块中使用_定义的对象类型,例如FrameType.f_localsarray.array.typecode。此类型用作对象属性的 Descriptors。它具有与property类型相同的目的,但适用于扩展模块中定义的类。
  • types. MemberDescriptorType

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

CPython 实现细节: 在其他 Python 实现中,此类型可能与GetSetDescriptorType相同。

  • 类别 types. MappingProxyType(Map)
    • Map 的只读代理。它提供了 Map 条目的动态视图,这意味着,当 Map 更改时,该视图将反映这些更改。

版本 3.3 中的新Function。

  • key in proxy

    • 如果基础 Map 具有键* key *,则返回True,否则返回False
  • proxy[key]

    • 使用键* key 返回基础 Map 的项目。如果 key *不在基础 Map 中,则引发KeyError
  • iter(proxy)

    • 在基础 Map 的键上返回迭代器。这是iter(proxy.keys())的快捷方式。
  • len(proxy)

    • 返回基础 Map 中的项目数。
  • copy ( )

    • 返回基础 Map 的浅表副本。
  • get(* key * [,* default *])

    • 如果* key 在基础 Map 中,则返回 key 的值,否则返回 default 。如果未提供 default *,则默认为None,因此该方法永远不会引发KeyError
  • items ( )

    • 返回基础 Map 项的新视图((key, value)对)。
  • keys ( )

    • 返回基础 Map 键的新视图。
  • values ( )

    • 返回基础 Map 值的新视图。

其他 Util 类和Function

  • 类别 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 中的新Function。

  • types. DynamicClassAttribute(* fget = None fset = None fdel = None doc = None *)
    • 将类的属性访问路由到__getattr__。

这是一个 Descriptors,用于定义pass实例和类访问时行为不同的属性。实例访问仍然正常,但是pass类对属性的访问将被路由到该类的__getattr_方法。这是pass引发 AttributeError 来完成的。

这样一来,一个实例就可以具有活动的属性,并且在类上具有相同名称的虚拟属性(有关示例,请参见 Enum)。

3.4 版的新Function。

协程 Util Function

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

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

3.5 版中的新Function。