面向对象之抽象类

面向对象之抽象类

一、接口与抽象类

[1]什么是接口

  • 因为Python中没有具体的接口概念我们以Java中的接口来对接口进行解释:我们以IAnimal.java(动物类)为例
  • Java的Interface接口的特征
    • 是一组功能的集合,而不是一个功能
    • 接口的功能用于交互,所有的功能都是public,即别的对象可操作
    • 接口只定义函数,但不涉及函数实现
    • 这些功能是相关的,都是动物相关的功能,但光合作用就不适宜放到IAnimal.java里面了
  • 简单来讲接口就是自己提供给使用者来调用自己功能的方式\方法\入口

[2]为什么要用接口

  • 接口提取了一群类共同的函数,可以把接口当做一个函数的集合,方便让子类去实现接口中的函数。
  • 使用接口的意义在于归一化:只要是基于同一个接口实现的类,那么所有的这些类产生的对象在使用时,从用法上来说都一样。
  • 归一化的好处:
    • 归一化让使用者无需关心对象的类是什么,只需要的知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度
    • 归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的对象集合

[3]接口与抽象类

  • Python中为了模仿接口定义的接口类,这些接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能
  • 向上述这样的接口类,只能被子类继承来使用其中的功能接口,而不能被实例化接口,就用到了抽象类
# 定义接口MouseInterface类来模仿接口的概念
class MouseInterface:
    # 定接口函数read
    def click(self):
        ...

    # 定义接口函数write
    def move(self):
        ...


# 罗技品牌的鼠标可以实现点击和移动功能
class LogitechMouse(MouseInterface):
    def click(self):
        ...

    def move(self):
        ...

# 雷蛇品牌的鼠标也可以实现点击和移动功能
class RazerMouse(MouseInterface):
    def click(self):
        ...

    def move(self):
        ...

  • 抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。
  • 抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计

二、抽象类详解

  • 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化
  • 抽象类的实现:与java一样,python也有抽象类的概念但是同样需要借助模块实现
#导入模块来实现抽象类
import abc


# 模仿定义接口类
# 需要在定义接口类时将参数metaclass设置为abc.ABCMeta
class AnimalInterface(object, metaclass=abc.ABCMeta):
    def __init__(self, name):
        self.name = name
	
    # 在子类必须实现的功能上放添加修饰器语法糖
    @abc.abstractmethod
    def eat(self):
        print(f'{self.name}需要进食!')
        
	# 在子类必须实现的功能上放添加修饰器语法糖
    @abc.abstractmethod
    def excretion(self):
        print(f'{self.name}需要排泄!')

# 只要继承了接口类就必选实现带有语法糖修饰的功能
class Duck(AnimalInterface):
    def __init__(self, name):
        super().__init__(name)
        self.name = name

    def eat(self):
        print(f'{self.name}需要进食!')

    def excretion(self):
        print(f'{self.name}需要排泄!')


class Mouse(AnimalInterface):
    def __init__(self, name):
        super().__init__(name)
        self.name = name

    def eat(self):
        print(f'{self.name}需要进食!')

    def excretion(self):
        print(f'{self.name}需要排泄!')


tang_duck = Duck('tang_duck')
tang_duck.eat()  # tang_duck需要进食!
tang_duck.excretion()  # tang_duck需要排泄!

mickey = Mouse('mickey')
mickey.eat()  # mickey需要进食!
mickey.excretion()  # mickey需要排泄!
posted @ 2024-01-29 14:45  桃源氏  阅读(21)  评论(0)    收藏  举报