ZetCode

Python type 函数

上次修改时间:2025 年 4 月 11 日

这份综合指南探讨了 Python 的 type 函数,该函数返回对象的类型或创建新的类型。我们将涵盖类型检查、动态类创建以及类型自省的实际示例。

基本定义

type 函数有两个用途:当使用一个参数调用时,它返回对象的类型;当使用三个参数调用时,它创建新的类型。

主要特征:返回一个类型对象(与 obj.__class__ 相同)。使用三个参数,它可以动态创建新的类。所有 Python 类都是 type 的实例。

基本类型检查

这是一个简单的用法,展示了 type 如何识别不同的 Python 对象。这是最常见的单参数用法。

basic_type.py
# 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() 通常更适合用于继承检查。

type_comparison.py
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 在底层创建类的方式。

dynamic_class.py
# 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 以创建自定义元类。

metaclass.py
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

此示例对比了 typeisinstance,以显示何时分别使用它们。

type_vs_isinstance.py
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

最佳实践

资料来源

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。到目前为止,我已经撰写了超过 1400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程