Python中的抽象

时间:2020-01-09 10:44:18  来源:igfitidea点击:

在这篇文章中,我们将看到OOPS概念抽象在Python中的用法。

什么是抽象

抽象意味着隐藏实现的复杂性,仅向用户公开基本功能。例如,我们可以将与电子产品互动的任何电子产品都使用按钮和开关打开或者关闭,或者增大或者减小音量或者速度。真正的复杂性,如何实现该功能对我们来说是隐藏的。

在面向对象编程的上下文中,抽象意味着仅公开端点(方法),并向最终用户隐藏实际实现。

Python中的抽象

Python中的抽象是通过使用抽象类和接口来实现的。

抽象类是包含一个或者多个抽象方法的类。抽象方法是不包含任何实现的方法,从抽象类继承的子类应提供抽象方法的实现。抽象类也可以具有常规方法(带有方法主体的方法),因此可以说抽象类通常提供不完整的功能,从而为通用方法提供实现,而将具体实现留给子类。

接口仅提供方法签名,而没有方法主体。子类应提供接口中定义的所有方法的实现。 Python不支持通过任何单独的关键字来创建接口,我们将不得不使用抽象类本身来定义接口。如果创建一个抽象类,它仅包含充当Python接口的抽象方法。

Python中使用抽象类的抽象

我们来看一个使用抽象类的Python抽象示例。为了声明一个Abstract类,我们需要导入abc模块。

在示例中,我们有一个Abstract类User,它具有一个具体方法display_user()和一个抽象方法process_fee()。

from abc import ABC, abstractmethod

class User(ABC):
    def __init__(self, name, num_of_months):
        self.name = name
        self.num_of_months = num_of_months

    # concrete method
    def display_user(self):
        print('User %s subscribed for %d months' % (self.name, self.num_of_months))

    # abstract method
    @abstractmethod
    def process_fee(self):
        pass

有两个子类从User继承并实现抽象方法process_fee()。

class PlatinumUser(User):
    PLATINUM_PACKAGE = 2200

    def process_fee(self):
        return self.num_of_months * PlatinumUser.PLATINUM_PACKAGE

class GoldUser(User):
    Gold_PACKAGE = 1500

    def process_fee(self):
        return self.num_of_months * GoldUser.Gold_PACKAGE

作为用户,我们只知道我们必须调用process_fee()方法,我们从该方法的实际实现中抽象出来,该实现因User的不同子类而异。

obj = PlatinumUser('Mike Dallas', 8)
obj.display_user()
fee = obj.process_fee()
print('Fee is', fee)

obj = GoldUser('Goldie Hawn', 6)
obj.display_user()
fee = obj.process_fee()
print('Fee is', fee)

obj = PlatinumUser('Ashish Mishra', 10)
obj.display_user()
fee = obj.process_fee()
print('Fee is', fee)

输出:

User Mike Dallas subscribed for 8 months
Fee is 17600
User Goldie Hawn subscribed for 6 months
Fee is 9000
User Ashish Mishra subscribed for 10 months
Fee is 22000