多态(Polymorphism)是指在面向对象编程中,不同类型的对象可以使用相同的接口,而具体的实现方式则各不相同。
换句话说,当我们调用一个方法时,不同的对象可以以不同的方式来响应这个方法调用。
这种极大地提高了代码的可复用性和可扩展性。
多态即是面向对象编程的三大特性之一,另外两个是封装和继承。
Python通过动态类型语言的特点来实现多态,即在运行时根据实际对象的类型进行方法调用。具体来说,Python中的多态实现依赖于以下两个特性:
下面通过一个例子来说明Python中的多态实现:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
raise NotImplementedError('Subclass must implement abstract method')
class Dog(Animal):
def speak(self):
return 'Woof!'
class Cat(Animal):
def speak(self):
return 'Meow!'
def animal_speak(animal):
print(animal.speak())
dog = Dog('Tommy')
cat = Cat('Kitty')
animal_speak(dog) # 输出:Woof!
animal_speak(cat) # 输出:Meow!
在上面的例子中,我们定义了一个Animal类和两个子类Dog和Cat,它们分别实现了speak()方法。
animal_speak()函数接受任何一个Animal对象,并调用其speak()方法。
由于Python是动态类型语言,因此在运行时可以根据实际传入的对象类型确定调用哪个speak()方法。
抽象类是一种只能被继承而不能被实例化的类。它定义了一个通用的接口,子类必须实现这个接口中定义的方法或属性。抽象类的存在可以让我们在设计和编写代码时更加灵活和规范。抽象类的主要作用有两个:
Python中的抽象类通过abc模块来实现。该模块提供了ABC(Abstract Base Class)类和abstractmethod装饰器,用于定义抽象类和抽象方法。
语法:
from abc import ABC, abstractmethod
class 类名(ABC):
@abstractmethod
def 函数名(self):
pass或者逻辑
下面是一个简单的示例:
from abc import ABC, abstractmethod
class AbstractClassExample(ABC):
@abstractmethod
def method1(self):
pass
@abstractmethod
def method2(self):
pass
class ConcreteClassExample(AbstractClassExample):
def method1(self):
print("Method 1 implementation")
def method2(self):
print("Method 2 implementation")
# 抽象类无法实例化
# example = AbstractClassExample()
# 子类可以实例化并调用方法
example = ConcreteClassExample()
example.method1() # 输出:"Method 1 implementation"
example.method2() # 输出:"Method 2 implementation"
在上面的示例中,AbstractClassExample是一个抽象类,它继承自ABC类。method1()和method2()被abstractmethod装饰器修饰,表示它们是抽象方法,子类必须实现这两个方法。
ConcreteClassExample是一个具体类,它继承自AbstractClassExample。
由于ConcreteClassExample重写了method1()和method2(),因此它可以实例化并调用这两个方法。
在使用抽象类时,需要注意以下几点:
抽象类是一种不能被实例化的类,它定义了其他类的通用接口和行为。Python通过abc模块来实现抽象类,使用ABC类作为基类和abstractmethod装饰器来定义抽象类和抽象方法。使用抽象类可以提供代码的规范性和灵活性,强制子类实现抽象方法,从而提高代码的可靠性和可维护性。然而,在使用抽象类时,需要注意抽象类不能被实例化、子类必须实现所有抽象方法等事项。
虽然多态可以提高代码的可复用性和可扩展性,但也需要注意一些问题。
多态是面向对象编程中非常重要的一个概念,它可以提高代码的可复用性和可扩展性。
Python作为一门支持面向对象编程的语言,通过动态类型语言的特点来实现多态,即在运行时根据实际对象的类型进行方法调用。同时,我们也需要注意抽象基类的规范定义、方法调用的存在性以及子类实现方式相互独立等问题。
from abc import ABC,abstractmethod
"""
1.需要使用abc模块实现抽象类,即定义抽象类的时候需要class 抽象类名称(ABC):
2.实现抽象类,要将抽象方法都实现
3.抽象类不能被实例化,会报错TypeError: Can't instantiate abstract class Animal with abstract methods cood, speak
4.抽象类中可以有构造函数,可以有普通函数
5.抽象方法可以有实现
"""
class Animal(ABC):
def __init__(self,type):
self.type = type
def speak(self):
print("要吃冻干")
@abstractmethod
def speak(self):
pass
# 抽象方法可以有实现
@abstractmethod
def cood(self):
print("要吃冻干")
class Cat(Animal):
color = None
def speak(self):
print("要吃冻干")
def cood(self):
print("要吃冻干")
cat = Cat("1")
cat.speak()