Python 抽象类

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/

(0)
上一篇 2023年9月26日
下一篇 2023年9月26日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注