python语言基础-2 面向对象-2.5 抽象类

声明:本内容非盈利性质,也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站,会尽量附上原文链接,并鼓励大家看原文。侵删。

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")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值