概述
在java,抽象类是面向对象设计中很重要的东西
由于python是动态语言,有很强的灵活性,本身并不支持抽象类,需要借助abc模块
abc模块,Abstract Base Class,抽象基类,可以定义方法,但不实现
抽象类
定义抽象类
- 导入abc模块
import abc 需要给抽象类指定
metaclass = abc.ABCMeta,该类不能实例化给抽象方法加上
@abc.abstractmethod,子类必须实现该方法,否则实例化报错
import abc
#只能被继承,不能实例化,否则报错
class Animal(metaclass = abc.ABCMeta):
#子类必须实现该方法,否则实例化报错
@abc.abstractmethod
def run(self):
pass
@abc.abstractmethod
def eat(self):
pass
实例化,如下:
a=Animal()
报错如下:
TypeError: Can't instantiate abstract class Animal with abstract methods eat, run
定义子类
子类有两种实现方式:
- 直接继承。简单,符合java风格
- 虚拟子类。灵活,符合python风格
直接继承
子类 必须实现 抽象类的 所有 抽象方法 ,子类才能被实例化
class People(Animal):
def run(self):
print("People is walking")
def eat(self):
print("people is eating")
class Pig(Animal):
def run(self):
print("Pig is running")
def eat(self):
print("people is eating")
实例化
peo1 = People()
pig1 = Pig()
peo1.run()
peo1.eat()
如果不全部实现就报错
该子类没有实例化eat()方法
class Dog(Animal):
def run(self):
print("Dog is zouing")
#实例化Dog时报错
#def eat(self):
# print("dog is eating")
实例化报错
d=Dog()
错误信息如下:
TypeError: Can't instantiate abstract class Dog with abstract methods eat
虚拟子类
将其他的类 注册 到抽象类下,当虚拟子类(调用register方法)
好处:
- 实现的第三方子类不需要继承抽象类
- 可以实现抽象基类中的 部分 抽象方法,也可以都不实现
- issubclass()进行判断返回True
实现子类:
class Dog:
def run(self):
print("Dog is running")
Animal.register(Dog)
测试:
d=Dog()
d.run()
print(issubclass(Dog,Animal))
感谢
https://www.cnblogs.com/anzhangjun/p/9780463.html
https://blog.csdn.net/qijiqiguai/article/details/77269839
https://blog.csdn.net/weixin_41624982/article/details/87650504