版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/c_first/article/details/81676976
接口
- 一个接口代表的就是一个功能
- 把复杂的逻辑隐藏起来,提供一个接口给外界使用
生活中的接口
- 电视机开关,按一下打开,按一下关闭,不需要关心它是怎么做到的,用就行了,这个开关就是个接口
java中有专门定义接口的关键字interface
python中没有定义接口的关键字
- python通过继承来模拟接口,父类定义好应该有哪些接口,子类去实现
class Animal: # 定义接口,相当于java的interface,模仿接口的概念
def eat(self): # 定义接口函数eat
pass
def run(self): # 定义接口函数run
pass
class People(Animal):
def eat(self): # 实现eat方法
print("eat")
def run(self): # 实现run方法
print("run")
class Dog(Animal):
def eat(self): # 实现eat方法
print("eat")
def run(self): # 实现run方法
print("run")
p = People()
p.run()
d = Dog()
d.eat()
但是上面的有个问题,People类和Dog类中实现的方法,没有受到父类的约束,不去实现也可以
接口统一的原则,父类定义好的接口,子类是必须要去实现的,而且实现的方法必须跟父类的定义的名字一样
class Animal: # 定义接口,相当于java的interface,模仿接口的概念
def eat(self): # 定义接口函数eat
pass
def run(self): # 定义接口函数run
pass
class People(Animal):
def talk(self):
print("talk")
class Dog(Animal):
def talk(self):
print("talk")
p = People()
p.run()
p.talk() # talk
d = Dog()
d.eat()
d.talk() # talk
抽象类
- 使用 abc模块,父类限制子类必须实现父类定义的接口,且名字必须一样
import abc
class Animal(metaclass=abc.ABCMeta): # 定义接口,相当于java的interface,模仿接口的概念
@abc.abstractclassmethod
def eat(self): # 定义接口函数eat
pass
@abc.abstractclassmethod
def run(self): # 定义接口函数run
pass
class People(Animal):
def talk(self):
print("talk")
class Dog(Animal):
def talk(self):
print("talk")
p = People()
p.run()
p.talk()
d = Dog()
d.eat()
d.talk()
# 没有实现父类的方法,报错
# TypeError: Can't instantiate abstract class People with abstract methods eat, run
实现父类的方法
import abc
class Animal(metaclass=abc.ABCMeta): # 定义接口,相当于java的interface,模仿接口的概念
@abc.abstractclassmethod
def eat(self): # 定义接口函数eat
pass
@abc.abstractclassmethod
def run(self): # 定义接口函数run
pass
class People(Animal):
def eat(self):
print("eat")
def run(self):
print("run")
def talk(self):
print("talk")
class Dog(Animal):
def eat(self):
print("eat")
def run(self):
print("run")
def talk(self):
print("talk")
p = People()
p.run()
p.talk()
d = Dog()
d.eat()
d.talk()
# run
# talk
# eat
# talk