Python 多态与类型匹配

  • Post category:Python

Python 多态与类型匹配使用方法的完整攻略

多态

多态是面向对象编程语言的一个重要特性,指相同的运算符或方法作用于不同的对象,会执行不同的操作。在 Python 中使用多态需要考虑以下两个方面:

  1. 继承同一个基类(或共同实现同一接口);
  2. 子类重写基类方法,并且函数参数及返回值的类型一致。

下面我们通过一个简单的例子来演示 Python 中的多态:

class Animal:
    def __init__(self, name):
        self.name = name

    def make_sound(self):
        pass

class Dog(Animal):
    def make_sound(self):
        return 'Woof!'

class Cat(Animal):
    def make_sound(self):
        return 'Meow!'

class Lion(Animal):
    def make_sound(self):
        return 'Roar!'

def animal_speak(animal):
    print(animal.name + ' speaks ' + animal.make_sound())

dog = Dog('Buddy')
cat = Cat('Garfield')
lion = Lion('Simba')

animal_speak(dog)   # 输出:Buddy speaks Woof!
animal_speak(cat)   # 输出:Garfield speaks Meow!
animal_speak(lion)  # 输出:Simba speaks Roar!

在上面的例子中,我们定义了一个 Animal 基类和三个子类 DogCatLion。这些子类都重写了基类的 make_sound 方法,传入 Animal 对象时,采用的是动态绑定机制,即根据实际的对象类型,调用相应的方法。这种机制就是多态的体现。

类型匹配

在 Python 中,函数的参数类型可以是任意类型(包括基本类型和用户自定义类型),因此类型匹配比较灵活。

然而在某些情况下,我们需要对输入参数的类型进行强制限定。比如 Python3 中新引入的类型注解功能,你可以使用一个冒号在参数后面添加对参数类型的注解:

def sum(a: int, b: int) -> int:
    return a + b

另一种方式是使用 assert 语句,可以强制函数输入参数的类型,并且当类型不符合条件时,会抛出 AssertionError 异常。

def sum(a, b):
    assert isinstance(a, int) and isinstance(b, int), 'a and b should be integers'
    return a + b

下面我们通过一个例子来展示一下类型匹配的使用方法:

from typing import List, Tuple

def print_info(name: str, age: int, scores: List[int], phone: Tuple[str, str]):
    print(f'My name is {name}, I\'m {age} years old.')
    print(f'My scores are {scores}, and my phone number is {phone}.')

print_info('Alice', 20, [65, 78, 89], ('+86', '13888888888'))

在上述例子中,我们使用了 typing 模块对输入参数的类型进行注解,并且对 scoresphone 参数强制了列表和元组类型。在函数调用时,如果输入参数类型与注解不符,会抛出类型错误,这样就可以帮助我们更好地捕获代码中的错误。

另外,需要注意的是:类型注解和类型匹配并不像其他语言那样是强制的,而只是一种约定,主要是为了提高代码的可读性和可维护性。