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
类中定义了两个方法,但是由于该类是抽象的,所以没有一个可以访问。请查看这个链接,了解关于抽象基类的更多细节。