接下来我将详细讲解如何浅谈Python中的多态。
什么是多态
在 Python 中,多态指的是同一类型的对象在不同情况下呈现出不同的行为。这里需要注意的是,多态本身不是一个新的概念,它可以在各种编程语言中使用,但是它对于 Python 这种静态的、强类型的语言来说是至关重要的。
多态的实现方式
在 Python 中,实现多态主要有两种方式:函数重载和方法重写。其中函数重载使用的不是特别多,方法重写则是实现多态的主要方式。
方法重写
方法重写是多态实现的一种常见方式。在 Python 中,方法重写通常指的是子类重写父类的方法并重新定义该方法。这个过程中,子类方法与父类方法的名称和参数列表都必须相同。
但是,子类方法可以以不同的方式实现,这样就能根据不同的上下文来改变方法的具体行为,从而实现多态。因此,方法重写也被视为是一种运行时多态。
接下来,我们将通过示例来演示 Python 中如何实现方法重写。
首先,我们定义一个简单的类:
class Animal:
def say_hello(self):
print('I am an animal')
对于这个 Animal 类来说,它只有一个 say_hello() 方法,当我们调用这个方法时,它只会打印一句话:I am an animal。现在,我们希望为这个类创建一个子类,并且在子类中重写 say_hello() 方法。具体做法如下:
class Dog(Animal):
def say_hello(self):
print('I am a dog')
我们创建了一个名为 Dog 的子类,并在该类中重写了 say_hello() 方法。在这个方法中,我们打印了一句话:I am a dog。接下来,我们创建一个名为 ani 的 Animal 类的对象和一个名为 dog 的 Dog 类的对象,代码编写如下:
ani = Animal()
dog = Dog()
现在,我们来分别调用这两个对象的 say_hello() 方法:
ani.say_hello() # 输出 I am an animal
dog.say_hello() # 输出 I am a dog
从上面的输出结果可以看出,ani 对象调用的是 Animal 类中的 say_hello() 方法,而 dog 对象调用的是 Dog 类中重写的 say_hello() 方法。这就是方法重写实现多态的实例。
鸭子类型
在 Python 中,还有一个实现多态的方式——鸭子类型。鸭子类型是一种动态类型语言的思想,它的核心是“如果它走起来像一只鸭子,叫起来也像一只鸭子,那么它就是一只鸭子。”
在 Python 中,鸭子类型意味着一个对象的类型不是根据它的类别来确定的,而是依据它的方法是否包含所需属性和方法来决定的。因此,如果一个对象可以正确地响应所请求的方法(无论是否显式地声明接口),就被认为是可用的。
接下来,我们将通过一个示例来演示 Python 中如何使用鸭子类型实现多态。
首先,我们定义一个 Speakable 接口:
class Speakable:
def speak(self):
pass
该接口只有一个方法——speak(),但是这个方法的主体为空。接下来,我们分别定义一个 Dog 类和一个 Cat 类,并让它们分别实现 Speakable 接口:
class Dog:
def speak(self):
print('wang wang')
class Cat:
def speak(self):
print('miao miao')
这里,我们没有继承 Speakable 接口,而是在 Dog 和 Cat 类中单独定义了 speak() 方法。这里要注意的是,尽管 Python 并没有严格的接口实现(如 Java 中的 Interface),但我们可以通过定义一些公共方法/属性的方式来模拟一个接口。
现在,我们来定义一个 say_hello() 函数,这个函数接收一个 Speakable 类型的参数,并让这个参数调用它的 speak() 方法:
def say_hello(speaker: Speakable):
speaker.speak()
这里我们采用了 Python 3.x 中的类型注释,声明了函数的输入参数 speaker 必须是 Speakable 类型。
接下来,我们来创建一个 Dog 类的对象 dog 和一个 Cat 类的对象 cat,然后将它们分别传递给 say_hello() 函数,代码编写如下:
dog = Dog()
cat = Cat()
say_hello(dog) # 输出 wang wang
say_hello(cat) # 输出 miao miao
从上述输出结果可以看出,虽然我们没有在 Dog 和 Cat 类中实现继承自 Speakable 接口,但是它们的 speak() 方法都是相同的,所以我们可以修改 say_hello() 函数来接受任何 Speakable 类型的对象,并且在运行时才确定具体实现的对象。
结论
在 Python 中,多态是实现软件工程中基于对象的编程的关键。方法重写和鸭子类型是实现多态的两种方法,在不同的情况下可以选择使用不同的方法。无论采用哪种方法,多态的本质都是将不同类型的对象封装在一个通用的接口中,从而使得这些对象可以根据需要灵活地替换使用。
希望这篇文章让你了解了 Python 中多态的基本概念和实现方式,同时也能帮助你更好地运用多态来进行软件开发。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈python中的多态 - Python技术站