Python 抽象属性
本篇文章将介绍使用 abc 或抽象基类模块在 Python 中创建具有抽象属性的类。
Python 抽象属性
面向对象编程中的抽象用于向用户隐藏不必要的信息。 函数的内部工作对用户是隐藏的,但是用户可以使用函数来执行任务。
例如,我们使用计算机软件来执行不同的任务,但我们不知道软件是如何执行任务的。 我们只为软件提供输入并从中获得输出。
我们可以在 Python 中使用抽象来通过隐藏不相关的信息来降低程序的复杂性。
如果一个类包含一个或多个抽象方法,它就会变成抽象类。 抽象方法定义在子类中,抽象类会继承子类,因为抽象类是其他类的蓝本。
在Python中,我们可以使用abc模块或者抽象基类模块来实现抽象类。 抽象基类为子类提供了一个接口,当代码很大并且很难记住所有类时,它很有用。
我们需要在基类中引入abc模块,并用它来将基类方法装饰成抽象。 定义一个抽象方法,我们可以在基类中定义方法之前使用@abstractmethod装饰器,我们可以使用@property装饰器使方法成为抽象属性。
例如,让我们导入 abc 模块并创建一个将从 ABC 类继承的 Bike 类。 在 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 类中定义了两个方法,但由于该类是抽象的,所以它们都不可访问。
相关文章
Pandas DataFrame DataFrame.shift() 函数
发布时间:2024/04/24 浏览次数:133 分类:Python
-
DataFrame.shift() 函数是将 DataFrame 的索引按指定的周期数进行移位。
Python pandas.pivot_table() 函数
发布时间:2024/04/24 浏览次数:82 分类:Python
-
Python Pandas pivot_table()函数通过对数据进行汇总,避免了数据的重复。
Pandas read_csv()函数
发布时间:2024/04/24 浏览次数:254 分类:Python
-
Pandas read_csv()函数将指定的逗号分隔值(csv)文件读取到 DataFrame 中。
Pandas 多列合并
发布时间:2024/04/24 浏览次数:628 分类:Python
-
本教程介绍了如何在 Pandas 中使用 DataFrame.merge()方法合并两个 DataFrames。
Pandas loc vs iloc
发布时间:2024/04/24 浏览次数:837 分类:Python
-
本教程介绍了如何使用 Python 中的 loc 和 iloc 从 Pandas DataFrame 中过滤数据。
在 Python 中将 Pandas 系列的日期时间转换为字符串
发布时间:2024/04/24 浏览次数:894 分类:Python
-
了解如何在 Python 中将 Pandas 系列日期时间转换为字符串