抽象类
约束子类中必须包含某些方法
#!./usr/bin/env python
# -*- coding: utf-8 -*-
# Date: 2020-07-31
# Author: Jimmy
import abc
class Walk(metaclass=abc.ABCMeta):
@abc.abstractmethod
def walk(self):
# 抽象方法,此处无需实现
pass
def slow_walk(self):
# 普通方法,可以自己实现
print('我在慢悠悠的走 ~')
class Swim(metaclass=abc.ABCMeta):
@abc.abstractmethod
def swim(self):
# 抽象方法,此处无需实现
pass
def slow_swim(self):
# 普通方法,可以自己实现
print('我在慢悠悠的游 ~')
class Fry(metaclass=abc.ABCMeta):
@abc.abstractmethod
def fry(self):
# 抽象方法,此处无需实现
pass
def slow_fry(self):
# 普通方法,可以自己实现
print('我在慢悠悠的游 ~')
class Tiger(Walk, Swim):
def walk(self):
# 必须实现抽象方法,不实现,实例化的时候会报错
print('我是一只老虎,我在散步 ~')
def swim(self):
# 必须实现抽象方法,不实现,实例化的时候会报错
print('我是一只老虎,我在游泳 ~')
class Bird(Walk, Fry):
def walk(self):
# 必须实现抽象方法,不实现,实例化的时候会报错
print('我是一只小小鸟,我在散步 ~')
def fry(self):
# 必须实现抽象方法,不实现,实例化的时候会报错
print('我是一只小小鸟,我在飞翔 ~')
def slow_fry(self):
# 可以重写抽象类的slow_fry
print('我是一只小小鸟,我在按照我自己的节奏慢悠悠的飞 ~ ')
tiger = Tiger()
bird = Bird()
tiger.slow_walk()
bird.slow_fry()
Walk Swim Fry在定义上可以理解为抽象类
Walk Swim Fry中不全是抽象方法
接口类
注意:Python中无接口这个概念
约束子类中必须包含父类规定的方法
#!./usr/bin/env python
# -*- coding: utf-8 -*-
# Date: 2020-07-31
# Author: Jimmy
import abc
class Walk(metaclass=abc.ABCMeta):
@abc.abstractmethod
def walk(self):
# 抽象方法,此处无需实现
pass
@abc.abstractmethod
def slow_walk(self):
# 抽象方法,此处无需实现
pass
class Swim(metaclass=abc.ABCMeta):
@abc.abstractmethod
def swim(self):
# 抽象方法,此处无需实现
pass
@abc.abstractmethod
def slow_swim(self):
# 抽象方法,此处无需实现
pass
class Fry(metaclass=abc.ABCMeta):
@abc.abstractmethod
def fry(self):
# 抽象方法,此处无需实现
pass
@abc.abstractmethod
def slow_fry(self):
# 抽象方法,此处无需实现
pass
class Tiger(Walk, Swim):
def walk(self):
# 必须实现,不实现,实例化的时候会报错
print('我是一只老虎,我在散步 ~')
def slow_walk(self):
# 必须实现,不实现,实例化的时候会报错
print('我是一只老虎,我在慢悠悠的走 ~')
def swim(self):
# 必须实现,不实现,实例化的时候会报错
print('我是一只老虎,我在游泳 ~')
def slow_swim(self):
# 必须实现,不实现,实例化的时候会报错
print('我是一只老虎,慢悠悠的游 ~')
class Bird(Walk, Fry):
def walk(self):
# 必须实现,不实现,实例化的时候会报错
print('我是一只小小鸟,我在散步 ~')
def slow_walk(self):
# 必须实现,不实现,实例化的时候会报错
print('我是一只小小鸟,我在慢悠悠的走 ~')
def fry(self):
# 必须实现,不实现,实例化的时候会报错
print('我是一只小小鸟,我在飞翔 ~')
def slow_fry(self):
# 必须实现,不实现,实例化的时候会报错
print('我是一只小小鸟,我在慢悠悠的飞翔 ~')
tiger = Tiger()
bird = Bird()
Walk Swim Fry 从定义上可以理解为接口类
Walk Swim Fry中全是抽象方法
总结
相同
都有抽象方法
都不可以实例化
区别
抽象类:约束子类中必须包含某些方法// 弱约束
接口类:约束子类中必须包含父类规定的方法 // 强约束
注意
接口类,python 原生不支持 在python中,并没有接口类这种东西,即便不通过专门的模块定义接口,我们也应该有一些基本的概念
1.多继承问题
在继承抽象类的过程中,我们应该尽量避免多继承;
而在继承接口的时候,我们反而鼓励你来多继承接口
2.方法的实现
在抽象类中,我们可以对一些方法做出基础实现;
而在接口类中,任何方法都只是一种规范,具体的功能需要子类实现
尽管ABCs可以让我们很方便的做类型检查,但是我们在代码中最好不要过多的使用它。 因为Python的本质是一门动态编程语言,其目的就是给你更多灵活性, 强制类型检查或让你代码变得更复杂,这样做无异于舍本求末。