声明:本内容非盈利性质,也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站,会尽量附上原文链接,并鼓励大家看原文。侵删。
2.5 抽象类
2.5.1 抽象类及其特点
从设计角度去看,类是从现实对象抽象而来的,那么抽象类就是基于类抽象而来的。
从实现角度看,抽象类相比于普通类有以下特点:
-
抽象类不能被实例化,只能被继承;(其非抽象的子类可以实例化)
-
抽象类必须包含一个或多个抽象方法(不实现方法体的方法),也可以包含其他方法和属性(如实例方法、类方法、静态方法、类属性以及实例属性);
-
继承抽象类的子类必须实现(即重写)所有的抽象方法。
2.5.2 创建抽象类
python中的抽象类要利用abc模块来实现。
如下创建了一个抽象类:
import abc # 导入abc模块
class All_file(metaclass=abc.ABCMeta):
all_type='file' # 抽象类中可以有类属性
@abc.abstractmethod # 定义抽象方法,无需实现功能
def read(self):
'子类必须定义读功能'
pass
@abc.abstractmethod # 定义抽象方法,无需实现功能
def write(self):
'子类必须定义写功能'
...
def __init__(self): # 抽象类中可以有初始化方法
self.name = "ll" # 抽象类中可以有公有实例属性
self.__age = 18 # 抽象类中可以有私有实例属性
@classmethod
def finding(cls): # 抽象类中可以有类方法
print("请查看")
@staticmethod
def loading(): # 抽象类中可以有静态方法
print("正在加载...")
def test(self): # 抽象类中可以有实例方法
print("正在测试{}".format(self.name))
class Txt(All_file): # 子类继承抽象类,但是必须定义read和write方法
def read(self):
print('文本数据的读取方法')
def write(self):
print('文本数据的读取方法')
t = Txt() # 非抽象子类可以实例化
# 如果使用另一种导入abc的方式也可以省去abc限定符
from abc import ABCMeta, abstractclassmethod
class All_file(metaclass=ABCMeta):
class All_file(metaclass=ABCMeta):
all_type='file' # 抽象类中可以有类属性
@abstractmethod # 定义抽象方法,无需实现功能
def read(self):
'子类必须定义读功能'
pass
@abstractmethod # 定义抽象方法,无需实现功能
def write(self):
'子类必须定义写功能'
pass
其他语言如java和C++中的抽象方法表现为没有方法体,python中的抽象方法要写一个pass或...
表示不需要方法体。
2.5.3 抽象方法重写(实现)
python中抽象方法重写与其他方法重写规则是一样的。示例如下:
import abc
class All_file(metaclass=abc.ABCMeta):
all_type='file'
@abc.abstractmethod
def read(self):
'子类必须定义读功能'
pass
@abc.abstractmethod
def write(self):
'子类必须定义写功能'
pass
class Txt(All_file):
def read(self, who): # 重写抽象方法,函数名相同,参数列表不同
print('文本数据的读取方法{}'.format(who))
def write(self): # 重写抽象方法,函数名相同,参数列表也相同
pass # 只要重写就行,哪怕子类中方法也没有真的实现
t = Txt()
t.read("reading")
如果是多继承,则子类必须重写所有父类中的所有抽象方法。如下:
import abc
class All_file(metaclass=abc.ABCMeta):
all_type='file'
@abc.abstractmethod
def read(self):
'子类必须定义读功能'
pass
@abc.abstractmethod
def write(self):
'子类必须定义写功能'
pass
class All_file2(metaclass=abc.ABCMeta):
all_type='file'
@abc.abstractmethod
def read2(self):
'子类必须定义读功能'
pass
@abc.abstractmethod
def write2(self):
'子类必须定义写功能'
pass
class Txt(All_file, All_file2): #子类继承抽象类,但是必须定义read和write方法
def read(self, who):
print('文本数据的读取方法{}'.format(who))
def write(self):
print('文本数据的读取方法')
def read2(self):
print("")
def write2(self):
print("")
t = Txt()
t.read("reading")