接口类 和 抽象类
抽象类和接口类
首先需要明确的是接口类和抽象类是由java语言中发展来的概念,它是java中的一种设计规范或方法。
Python提供了对抽象类的支持借助于 abc
模块
Python中可以沿用接口类的概念编程但是 Python不提供具体的实现方式
,也就是说 Python中并没有接口类
但是依然可以使用接口类的设计方式来规范代码
接口类的设计提倡功能设计的简单,专一,不要将接口设计的臃肿而复杂。接口需要尽可能的降低耦合,遵循接口隔离原则。
抽象类推荐单继承,接口类的使用鼓励多继承(细化接口,依据实际需求把握粒度)。
抽象类
抽象类是抽取多个功能具有相似点的类而形成的新类,由于它是多个类的共同点的抽象,因此它天生就是为继承而存在。
抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化
允许在类内部实现某些方法,抽象类的内部允许一般的实例方法,而不一定都要是抽象方法
抽象类要将子类中一致的方法实现,这样避免在多个子类中重复的实现一样的方法造成冗余。例如BasePerson类中实现了sleep方法,因为所有的人都会睡觉,且睡觉的行为一致。但是say方法没有实现,因为不同的角色说话的方式是不同的,需要在子类中自己来实现。
接口类
严格的讲Python中就没有 接口类这么个东西。仅仅对抽象类提供支持 abc
- 接口类中不允许有构造方法
- 接口类中必须不能实现任何方法
- 接口类定义需要遵循接口隔离原则和单一化原则
- 接口隔离:尽可能的将接口粒度细化。
- 单一原则:尽可能将接口的职责单一化。
例子
import abc
class Developer(metaclass=abc.ABCMeta):
"""这个 看似他遵循了接口类的定义~ 但是仅仅是为了遵循接口隔离设计思想。"""
@abc.abstractmethod
def coding(self):pass
@abc.abstractmethod
def debug(self):pass
class Teacher(metaclass=abc.ABCMeta):
@abc.abstractmethod
def teach(self):pass
class BasePerson(metaclass=abc.ABCMeta):
""" 抽象类"""
@abc.abstractmethod
def say(self):pass # 抽象方法
def sleep(self): # 可以实现方法,并且不要求子类必须实现这个方法。
print("我会睡觉")
class ComputerTeacher(BasePerson,Developer,Teacher):
def coding(self):
print("我会编程")
def teach(self):
print("我会教学生")
def say(self):
print("我将会教学生一些编程的方法和技巧!")
def debug(self):
print("天天就会写bug!!!")
a = ComputerTeacher()
a.say()
a.sleep()
a.teach()
a.coding()
a.debug()