抽象类
约束子类中必须包含某些方法
#!./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的本质是一门动态编程语言,其目的就是给你更多灵活性, 强制类型检查或让你代码变得更复杂,这样做无异于舍本求末。