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()
通常在元编程中使用,并在编写处理动态类型和类的代码时使用。这点我们以后再详细聊 :)
GO TO FULL VERSION