Python 中的抽象类是一种特殊的类,它不能被实例化,只能用作其他类的基类。抽象类通常包含抽象方法,这些方法在基类中被声明但没有具体的实现。子类必须实现这些抽象方法才能被实例化。当我们设计大型功能单元时,我们使用抽象类。当我们想要为组件的不同实现提供通用接口时,我们使用抽象类。
Python 中的抽象基类
通过定义抽象基类,您可以为一组子类定义公共应用程序接口(API)。此功能在第三方将提供实现(例如使用插件)的情况下特别有用,但在大型团队或大型代码库中工作时也可以为您提供帮助。
处理 Python 抽象类
默认情况下,Python不提供抽象类。Python 附带了一个模块,它提供了定义抽象基类(ABC)的基础,该模块名称为 ABC。ABC的工作原理是将基类的方法装饰为抽象,然后将具体类注册为抽象基类的实现。当用关键字 @abstractmethod 修饰时,方法变得抽象。
示例1:
这个Python程序演示了如何使用抽象基类(Abstract Base Class)来定义抽象方法和继承它们。在这个示例中,我们有一个抽象基类 Polygon,它定义了一个抽象方法 noofsides,表示多边形的边数。然后,我们有四个具体的多边形类,分别是 Triangle、Quadrilateral、Pentagon 和 Hexagon,它们都继承自抽象基类 Polygon 并覆盖了 noofsides 方法,提供了每种多边形的边数。在程序的最后,我们创建了不同类型的多边形对象(Triangle、Quadrilateral、Pentagon 和 Hexagon),并调用了它们的 noofsides 方法,以显示各自的边数。
# Python程序示例
# 抽象基类示例
from abc import ABC, abstractmethod
# 定义抽象基类 Polygon
class Polygon(ABC):
@abstractmethod
def noofsides(self):
pass
# 定义子类 Triangle
class Triangle(Polygon):
# 重写抽象方法
def noofsides(self):
print("我有3条边")
# 定义子类 Pentagon
class Pentagon(Polygon):
# 重写抽象方法
def noofsides(self):
print("我有5条边")
# 定义子类 Hexagon
class Hexagon(Polygon):
# 重写抽象方法
def noofsides(self):
print("我有6条边")
# 定义子类 Quadrilateral
class Quadrilateral(Polygon):
# 重写抽象方法
def noofsides(self):
print("我有4条边")
# 主程序
R = Triangle()
R.noofsides()
K = Quadrilateral()
K.noofsides()
R = Pentagon()
R.noofsides()
K = Hexagon()
K.noofsides()
输出:
我有3条边
我有4条边
我有5条边
我有6条边
示例2:
这段代码演示了Python中抽象基类(Abstract Base Class,ABC)的使用。抽象基类是一种定义了一组抽象方法的类,这些抽象方法在子类中必须被重写以实现具体的行为。在代码中,我们创建了一个名为Animal的抽象基类,其中包含了一个名为move的抽象方法。
然后,我们创建了四个子类,分别是Human、Snake、Dog和Lion,它们都继承自Animal抽象基类,并重写了move方法,以定义各自不同的移动方式。
在主程序部分,我们创建了四个对象:R是Human的实例,K是Snake的实例,R(重新赋值)是Dog的实例,K(重新赋值)是Lion的实例。然后,我们分别调用这些对象的move方法,根据它们的类型,每个对象都会打印出与其相关的移动方式。
# Python程序示例
# 抽象基类示例
from abc import ABC, abstractmethod
# 定义抽象基类 Animal
class Animal(ABC):
@abstractmethod
def move(self):
pass
# 定义子类 Human
class Human(Animal):
# 重写抽象方法
def move(self):
print("我可以走路和跑步")
# 定义子类 Snake
class Snake(Animal):
# 重写抽象方法
def move(self):
print("我可以爬行")
# 定义子类 Dog
class Dog(Animal):
# 重写抽象方法
def move(self):
print("我可以吠叫")
# 定义子类 Lion
class Lion(Animal):
# 重写抽象方法
def move(self):
print("我可以咆哮")
# 主程序
R = Human()
R.move()
K = Snake()
K.move()
R = Dog()
R.move()
K = Lion()
K.move()
输出:
我可以走路和跑步
我可以爬行
我可以吠叫
我可以咆哮
通过子类实现抽象
这段代码演示了通过子类化来实现抽象类的概念。在Python中,可以使用abc模块来创建抽象基类,并通过子类继承并实现抽象方法。
在代码中,我们首先定义了一个名为parent的类,其中包含了一个名为geeks的抽象方法。然后,我们创建了一个名为child的子类,它继承自parent类,并重写了geeks方法。
在主程序部分,我们使用了issubclass和isinstance内置函数来检查类之间的关系。具体地说,我们检查了child是否是parent的子类(通过issubclass(child, parent))以及child()对象是否是parent类的实例(通过isinstance(child(), parent))。
# Python程序展示通过子类化实现抽象类
import abc
class parent:
def geeks(self):
pass
class child(parent):
def geeks(self):
print("子类")
# 驱动代码
print(issubclass(child, parent))
print(isinstance(child(), parent))
输出:
True
True
抽象基类中的具体方法
具体类仅包含具体(普通)方法,而抽象类可能同时包含具体方法和抽象方法。具体类提供抽象方法的实现,抽象基类也可以通过 super() 调用方法来提供实现。让我们看一下使用 super() 调用该方法的示例:
# Python program invoking a
# method using super()
import abc
from abc import ABC, abstractmethod
class R(ABC):
def rk(self):
print("Abstract Base Class")
class K(R):
def rk(self):
super().rk()
print("subclass ")
# Driver code
r = K()
r.rk()
输出:
Abstract Base Class
subclass
在上面的程序中,我们可以使用super()来调用抽象类中的方法。
Python 中的抽象属性
抽象类除了方法之外还包含属性,您可以通过使用@abstractproperty定义它们来要求具体类中的属性。
# Python program showing
# abstract properties
import abc
from abc import ABC, abstractmethod
class parent(ABC):
@abc.abstractproperty
def geeks(self):
return "parent class"
class child(parent):
@property
def geeks(self):
return "child class"
try:
r =parent()
print( r.geeks)
except Exception as err:
print (err)
r = child()
print (r.geeks)
输出:
Can't instantiate abstract class parent with abstract methods geeks
child class
在上面的示例中,基类无法实例化,因为它只有属性获取方法的抽象版本。
抽象类实例化
抽象类(Abstract Base Class)不能直接实例化。抽象类用于定义一组共享的方法,但不能被直接用于创建对象。要使用抽象类,您需要创建一个具体的子类,然后在子类中实现所有抽象方法,并通过子类来实例化对象。当我们为抽象类创建对象时,它会引发错误。
# Python program showing
# abstract class cannot
# be an instantiation
from abc import ABC,abstractmethod
class Animal(ABC):
@abstractmethod
def move(self):
pass
class Human(Animal):
def move(self):
print("I can walk and run")
class Snake(Animal):
def move(self):
print("I can crawl")
class Dog(Animal):
def move(self):
print("I can bark")
class Lion(Animal):
def move(self):
print("I can roar")
c=Animal()
输出:
Traceback (most recent call last):
File "/home/ffe4267d930f204512b7f501bb1bc489.py", line 19, in
c=Animal()
TypeError: Can't instantiate abstract class Animal with abstract methods move
原创文章,作者:jkhxw,如若转载,请注明出处:https://www.jkhxw.com/python-abstract-classes/