python接口和抽象类的区别_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

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的本质是一门动态编程语言,其目的就是给你更多灵活性, 强制类型检查或让你代码变得更复杂,这样做无异于舍本求末。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值