第十二天
上次我们说了面向对象的三大特征,即封装、继承、多态,今天我们来说一说Python中的抽象类和接口。
抽象类
与Java一样,python也有抽象类的概念,但是与Java不同的是在python中抽象类需要借助模块实现,抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化。
注意:抽象类的本质还是类,指的是一组类的相似性,包括数据属性和函数属性。
import abc #利用abc模块实现抽象类
class Animal(metaclass=abc.ABCMeta):
def run(self): #普通方法
print('动物可以跑')
@abc.abstractmethod #定义抽象方法,无需实现功能
def eat(self):
pass
if __name__ == '__main__':
animal = Animal()
#Can't instantiate abstract class Animal with abstract methods eat
通过上述代码,我们可以简单总结如下:
1、Python使用抽象类需要借助abc模块;
2、抽象类中可以有抽象方法,也可以没有抽象方法,但是只要有抽象方法,那么这个类一定是抽象类;
3、存在抽象方法的抽象类不可以创建实例,只可以被继承,子类必须重写抽象类的抽象方法,同时子类也可以有自己的方法;
4、类是从现实对象抽象而来的,那么抽象类就是基于类抽象而来的;
import abc #利用abc模块实现抽象类
class Animal(metaclass=abc.ABCMeta):
def run(self): #普通方法
print('动物可以跑')
@abc.abstractmethod #定义抽象方法,无需实现功能
def eat(self):
pass
class Dog(Animal):
def eat(self): #重写父类的抽象eat方法
print('狗狗在吃饭')
def hao(self):
print('狗狗可以嚎叫')
if __name__ == '__main__':
dog = Dog()
dog.run()
dog.eat()
dog.hao()
接口
其实在python中,并没有接口的概念,不像Java中的interface,因为在其他面向对象的语言中,是单继承,接口的出现是为了弥补继承的不足,而在python中,是多继承,也就没有所谓的接口了。
刚我们说了抽象类,抽象类可以说是类和接口的混合体,既可以有常规方法,也可以存在约束子类的方法-抽象方法。那么我们就可以说接口是对子类完全约束,接口中存在什么方法,那么继承类中就必须重写什么方法,接口就是一个规范,不存在其他的代码。
注意:python中无接口类型,定义接口只是人为规定,在编程过程自我约束!!!
import abc #利用abc模块实现抽象类
class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod # 定义抽象方法,无需实现功能
def run(self):
pass
@abc.abstractmethod #定义抽象方法,无需实现功能
def eat(self):
pass
class Pets():
def xi(self):
print('宠物在洗澡')
class Dog(Animal,Pets):
def eat(self):
print('狗狗在吃饭')
def run(self):
print('狗狗在跑路')
def hao(self):
print('狗狗可以嚎叫')
if __name__ == '__main__':
dog = Dog()
dog.run()
dog.eat()
dog.xi()
dog.hao()
这里我们其实可以将Animal称为接口,定义的方法均是让继承的子类重写的,提供了一种规范。
3、总结
今天的内容比较简单,更多的需要理解。下次我们来说说py文件如何打包成可执行exe文件。
网友评论