Python type 函数
上次修改时间:2025 年 4 月 11 日
这份综合指南探讨了 Python 的 type
函数,该函数返回对象的类型或创建新的类型。我们将涵盖类型检查、动态类创建以及类型自省的实际示例。
基本定义
type
函数有两个用途:当使用一个参数调用时,它返回对象的类型;当使用三个参数调用时,它创建新的类型。
主要特征:返回一个类型对象(与 obj.__class__
相同)。使用三个参数,它可以动态创建新的类。所有 Python 类都是 type
的实例。
基本类型检查
这是一个简单的用法,展示了 type
如何识别不同的 Python 对象。这是最常见的单参数用法。
# Built-in types print(type(42)) # <class 'int'> print(type(3.14)) # <class 'float'> print(type("hello")) # <class 'str'> print(type([1, 2, 3])) # <class 'list'> print(type(True)) # <class 'bool'> # Custom class class MyClass: pass obj = MyClass() print(type(obj)) # <class '__main__.MyClass'>
此示例显示了 type
返回内置类型和自定义类的类对象。输出格式为 <class 'typename'>
。
对于自定义类,模块名称(此处为 __main__
)包含在类型名称中。这有助于区分同名的类。
类型比较
type
可以用于检查对象的确切类型,尽管 isinstance()
通常更适合用于继承检查。
value = 3.14 # Exact type checking if type(value) == float: print("It's a float") # Prints # Not recommended for inheritance cases class Parent: pass class Child(Parent): pass obj = Child() print(type(obj) == Parent) # False print(isinstance(obj, Parent)) # True
这展示了 type
用于精确的类型匹配。与 isinstance
不同,它不会匹配父类,后者遵循继承。
当您需要确切的类时使用 type
,当您希望在检查中包含子类时使用 isinstance
。
动态类创建
type
的三个参数形式动态地创建新的类。这就是 Python 在底层创建类的方式。
# Equivalent to: class Person: pass Person = type('Person', (), {}) # With attributes and methods def greet(self): return f"Hello, {self.name}" Person = type('Person', (), { '__init__': lambda self, name: setattr(self, 'name', name), 'greet': greet }) p = Person("Alice") print(p.greet()) # Hello, Alice print(type(p)) # <class '__main__.Person'>
这演示了动态类创建。三个参数是:类名,基类元组和包含属性/方法的命名空间字典。
这就是 Python 的 class
语句在内部工作的方式 - 它调用 type
来创建类对象。
元类用法
type
是 Python 中的默认元类。所有类都是 type
的实例,您可以子类化 type
以创建自定义元类。
class Meta(type): def __new__(cls, name, bases, namespace): print(f"Creating class {name}") return super().__new__(cls, name, bases, namespace) class MyClass(metaclass=Meta): pass # Output: Creating class MyClass print(type(MyClass)) # <class '__main__.Meta'>
这显示了一个从 type
继承的自定义元类。元类可以修改类的创建。请注意 type(MyClass)
如何显示元类。
元类是高级 Python 功能,允许对类创建行为进行深度自定义。
Type vs isinstance
此示例对比了 type
和 isinstance
,以显示何时分别使用它们。
class Animal: pass class Dog(Animal): pass d = Dog() # type checks exact class print(type(d) == Dog) # True print(type(d) == Animal) # False # isinstance checks inheritance print(isinstance(d, Dog)) # True print(isinstance(d, Animal)) # True # Checking against multiple types print(isinstance(d, (Dog, str, list))) # True
type
检查精确的类匹配,而 isinstance
检查整个继承链。 isinstance
还支持针对多种类型进行检查。
通常,除非您特别需要排除子类,否则首选 isinstance
。
最佳实践
- 首选 isinstance: 对于大多数类型检查需求
- 谨慎使用 type: 当需要精确的类匹配时
- 动态类: 使用 type() 进行动态类创建
- 元类: 子类化 type 以进行高级自定义
- 文档: 清楚地记录动态类创建
资料来源
作者
列出所有 Python 教程。