迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

Python 抽象属性

作者:迹忆客 最近更新:2023/06/18 浏览次数:

本篇文章将介绍使用 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 类中定义了两个方法,但由于该类是抽象的,所以它们都不可访问。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Pandas read_csv()函数

发布时间:2024/04/24 浏览次数:254 分类:Python

Pandas read_csv()函数将指定的逗号分隔值(csv)文件读取到 DataFrame 中。

Pandas 追加数据到 CSV 中

发布时间:2024/04/24 浏览次数:352 分类:Python

本教程演示了如何在追加模式下使用 to_csv()向现有的 CSV 文件添加数据。

Pandas 多列合并

发布时间:2024/04/24 浏览次数:628 分类:Python

本教程介绍了如何在 Pandas 中使用 DataFrame.merge()方法合并两个 DataFrames。

Pandas loc vs iloc

发布时间:2024/04/24 浏览次数:837 分类:Python

本教程介绍了如何使用 Python 中的 loc 和 iloc 从 Pandas DataFrame 中过滤数据。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便