Python抽象属性

本教程将讨论使用abc 或抽象基类模块来创建Python中具有抽象属性的类。

Python抽象属性

面向对象编程中的抽象是用来向用户隐藏不必要的信息。一个函数的内部工作将对用户隐藏起来,但用户可以使用这个函数来完成一项任务。

例如,我们使用计算机软件来执行不同的任务,但我们不知道软件如何执行任务。我们只给软件输入并从它那里得到输出。

我们可以在Python中使用抽象,通过隐藏不相关的信息来降低程序的复杂性。

如果一个类包含一个或多个抽象方法,它将成为抽象的。抽象方法被定义在子类中,抽象类将从子类中继承,因为抽象类是其他类的蓝图。

在 Python 中,我们可以使用abc 模块或抽象基类模块来实现抽象类。抽象基类为子类提供了一个接口,当代码很大,记住所有的类很有挑战性时,它是很有好处的。

我们需要在基类中导入abc 模块,用它将基类方法装饰成抽象的。为了定义一个抽象的方法,我们可以在基类中定义方法之前使用@abstractmethod 装饰器,我们可以使用@property 装饰器来使方法成为一个抽象的属性。

例如,让我们导入abc 模块并创建一个Bike 类,该类将继承于ABC类。在Bike 类中,我们将创建一个抽象的方法,mileage()

现在我们可以继承基类,用抽象方法实现不同的子类。请看下面的代码。

# Class Code
from abc import ABC, abstractmethod
class Bike(ABC):
    @property
    @abstractmethod
    def mileage(self):
        pass
class Honda(Bike):
    def mileage(self):
        print("The mileage is 20kmph")
class CD70(Bike):
    def mileage(self):
        print("The mileage is 15kmph ")
class CD150(Bike):
    def mileage(self):
        print("The mileage is 34kmph ")
# Main Code
h = Honda()
h.mileage()
r = CD70()
r.mileage()
s = CD150()
s.mileage()

输出:

The mileage is 20kmph
The mileage is 15kmph
The mileage is 34kmph

在上面的代码中,我们创建了子类的对象,然后我们调用它们的方法mileage() ,这将打印自行车的里程数。Bike 类也有mileage() 方法,但我们不能调用它,因为该方法是抽象的。

例如,让我们重复上面的例子,调用Bike 类的mileage 方法。请看下面的代码。

# Class Code
from abc import ABC, abstractmethod
class Bike(ABC):
    @property
    @abstractmethod
    def mileage(self):
        pass
class Honda(Bike):
    def mileage(self):
        print("The mileage is 20kmph")
class CD70(Bike):
    def mileage(self):
        print("The mileage is 15kmph ")
class CD150(Bike):
    def mileage(self):
        print("The mileage is 34kmph ")
# Main Code
b = Bike()
b.mileage()

输出:

TypeError: Can't instantiate abstract class Bike with abstract methods mileage

上面的代码清楚地表明,抽象类Bike 有抽象的方法,这就是为什么它的对象不能被创建,它的方法也不能被调用。

我们也可以在第一个方法的定义前使用@abstractmethod 装饰器使其他类的方法成为抽象方法。当人们试图制造一个该类的对象来访问这些方法时,Python 会给出一个错误。

例如,让我们把一个子类的方法做成抽象的。请看下面的代码。

# Class Code
from abc import ABC, abstractmethod
class Bike(ABC):
    @property
    @abstractmethod
    def mileage(self):
        pass
class Honda(Bike):
    @abstractmethod
    def mileage(self):
        print("The mileage is 20kmph")
    def mileage2(self):
        print("The mileage is 200 kmph")
# Main Code
b = Honda()
b.mileage2()

输出:

TypeError: Can't instantiate abstract class Honda with abstract methods mileage

我们在Honda 类中定义了两个方法,但是由于该类是抽象的,所以没有一个可以访问。请查看这个链接,了解关于抽象基类的更多细节。