CodeGym /课程 /Python SELF ZH /类型检查

类型检查

Python SELF ZH
第 16 级 , 课程 3
可用

9.1 type() 函数

在 Python 中,有几个内置函数用于检查对象的类型和类。这些函数对于编写能够处理多种数据类型的灵活且安全的代码非常有用。

下面我会介绍一些最流行的:type()isinstance()issubclass(),还有用于类型注释的函数,比如 getattr()hasattr()

type() 函数

type() 函数返回对象的类型。你应该已经用过它,对吧?


x = 10
print(type(x))  # Output: <class 'int'>

但你可能不知道的是,它还可以用来创建新的类!

创建新的类

如果传递给它三个参数,它就会创建一个新的类型(类)。

这个操作的签名是:


type(name, bases, dict)

其中:

  • name — 创建类的名称(字符串)。
  • bases — 基础类(父类)的元组,新类将继承自这些类。
  • dict — 包含新类的属性和方法的字典。

创建一个简单的类:


MyClass = type('MyClass', (), {'say_hello': lambda self: print("Hello!")})

# 创建类的实例
instance = MyClass()
instance.say_hello()  # Output: Hello!

你甚至可以创建更复杂的东西:


MyClass = type('MyClass', (), {
    'attribute': 42,
    '__init__': lambda self, value: setattr(self, 'value', value),
    'display_value': lambda self: print(self.value)
})
            
# 创建类的实例
instance = MyClass(10)
print(instance.attribute)  # Output: 42
instance.display_value()  # Output: 10

所以现在你不仅可以定义对象的类型,还可以创建类、生成对象,然后确定它们的类型。

9.2 isinstance() 函数

isinstance() 函数 是一个 Python 中的内置函数,用于检查对象是否属于某个类或类的元组。如果对象是指定类或 任何 指定类之一 的实例,它返回 True,否则返回 False

签名和参数:


isinstance(object, classinfo)

其中:

  • object — 需要验证其所属类或类的对象。
  • classinfo — 类、类型或类和类型的元组,针对这些类或类型来检查对象。

使用示例:

检查是否属于一个类


x = 10
print(isinstance(x, int))  # Output: True
            
y = "Hello"
print(isinstance(y, str))  # Output: True

检查是否属于多个类 — 至少属于一个类:


x = 10
print(isinstance(x, (int, float)))  # Output: True
            
y = "Hello"
print(isinstance(y, (int, str)))  # Output: True
            
z = 3.14
print(isinstance(z, (int, str)))  # Output: False

检查是否属于自定义类


class Animal:
    pass
        
class Dog(Animal):
    pass
        
dog = Dog()
        
print(isinstance(dog, Dog))  # Output: True
print(isinstance(dog, Animal))  # Output: True

与使用 type() 进行直接类型比较不同,isinstance() 在继承方面表现更好,它会检查对象是否属于继承层次结构中的任何类。

9.3 issubclass() 函数

issubclass() 函数 是一个 Python 中的内置函数,用于检查指定的类是否是另一个类或元组中任何类的子类。如果第一个参数确实是第二个参数的子类,它返回 True,否则返回 False

签名和参数:


issubclass(class, classinfo)

其中:

  • class — 需要验证其是否为某个类或类的子类的类。
  • classinfo — 类、类型或类和类型的元组,针对这些类或类型来检查第一个参数。

使用示例:

检查是否为一个类的子类



class Animal:
    pass
         
class Dog(Animal):
    pass
        
print(issubclass(Dog, Animal))  # Output: True
print(issubclass(Animal, Dog))  # Output: False 

检查是否为多个类之一的子类 — 至少一个类:


class Animal:
    pass
        
class Dog(Animal):
    pass
        
class Cat(Animal):
    pass
        
print(issubclass(Dog, (Animal, Cat)))  # Output: True
print(issubclass(Dog, (Cat,)))  # Output: False

自定义类的示例

继承自内置类


class MyInt(int):
    pass
        
print(issubclass(MyInt, int))  # Output: True
print(issubclass(int, MyInt))  # Output: False

继承层次结构


class A:
    pass
        
class B(A):
    pass
        
class C(B):
    pass
        
print(issubclass(C, A))  # Output: True
print(issubclass(C, B))  # Output: True
print(issubclass(B, A))  # Output: True
print(issubclass(A, C))  # Output: False

使用 issubclass() 的好处

检查类的层次结构: issubclass() 允许检查类的层次结构,这对于确保继承的正确性和代码结构是有益的。

灵活性: 该函数支持检查单个类或类的元组,使其在不同场景中灵活使用。

适用于元编程: issubclass() 通常在元编程中使用,并在编写处理动态类型和类的代码时使用。这点我们以后再详细聊 :)

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION