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 教程。