首页 > 其他分享 >抽象基类

抽象基类

时间:2023-04-07 16:00:09浏览次数:33  
标签:__ 子类 self 抽象 基类 data

ABC类全称是Abstract Base Classes
  • 抽象基类可以通过ABC派生来简单创建
  • 抽象基类的特点:
    • 基类不应允许初始化
    • 接口方法未实现时报告相关错误
  • 可以把抽象基类想象成建筑的设计图纸,然后子类按图施工
  • abc模块提供了一个元类ABCMeta可定义抽象类
  • 还有一个工具类ABC 可有以继承的方式定义抽奖基类
# -*- coding: utf-8 -*-
# @Time:     2023/4/7 14:12     
# @Author:   LiQi
# @Describe:

from abc import ABC


# 继承的方式定义抽象基类
class TestClass(ABC):
    ...

from abc import ABCMeta

# 元类指定的方式定义抽象基类
class TestClass(metaclass=ABCMeta):
    ...
@abstractmethod装饰器
  • 所在的类继承ABC或者声明元类ABCMeta
  • 需要抽象的实例方法添加装饰器 @abstractmethod
  • 使用抽象类, 必须继承该类并实现该类的所有抽象方法
写一个抽奖基类,声明抽象方法
# -*- coding: utf-8 -*-
# @Time:     2023/4/7 14:12     
# @Author:   LiQi
# @Describe:

import abc

# 创建数据抽象基类
from abc import ABC
class BasicsCreateData(metaclass=abc.ABCMeta):

    def base_docs(self):
        print('没有声明抽象方法')

    # 声明抽象方法-查询数据
    @abc.abstractmethod
    def get_data(self):
        ...

    # 声明抽象方法-放入数据
    @abc.abstractmethod
    def put_data(self, data):
        ...

    # 声明抽象方法-删除数据
    @abc.abstractmethod
    def del_data(self):
        ...

    # 声明抽象方法-修改数据
    @abc.abstractmethod
    def set_data(self, data):
        ...
抽象未实现示例

image

正确继承抽象类使用示例
# 继承抽奖基类-实现所有的abstractmethod抽象方法
# 基类的base_docs没有声明抽象方法,子类可有无需实现
class CreateData(BasicsCreateData):
    def __init__(self):
        self.data_list = []

    def get_data(self):
        return self.data_list

    def set_data(self, data: list):
        self.data_list.extend(data)
        return self.data_list

    def del_data(self):
        self.data_list.clear()

    def put_data(self, data):
        self.data_list.append(data)


if __name__ == '__main__':
    __data = CreateData()
    __data.put_data('test')
    __data.get_data()
    __data.del_data()
    __data.set_data(['1', '2', '3'])
    __data.get_data()

abstractmethod内部实现
def abstractmethod(funcobj):
    """A decorator indicating abstract methods.

    Requires that the metaclass is ABCMeta or derived from it.  A
    class that has a metaclass derived from ABCMeta cannot be
    instantiated unless all of its abstract methods are overridden.
    The abstract methods can be called using any of the normal
    'super' call mechanisms.  abstractmethod() may be used to declare
    abstract methods for properties and descriptors.

    Usage:

        class C(metaclass=ABCMeta):
            @abstractmethod
            def my_abstract_method(self, ...):
                ...
    """
    funcobj.__isabstractmethod__ = True
    return funcobj

  • 装饰器的作用设置funcobj相当于抽象基类的__isabstractmethod__为True
  • 子类在实例的时候会调用 instancecheck 魔法方法检查抽象方法的实现
@abstractstaticmethod装饰器
  • abstractstaticmethod继承staticmethod
  • 相当于是声明静态的抽象方法
@abstractclassmethod装饰器
  • abstractclassmethod继承classmethod
  • 相当于是声明类抽象方法
虚拟子类

为了程序的完整性,有时候我们需要让一个类成为另一个类的子类,但是我们不希望这个继承的操作让我们不得不在挂载的子类上实现那些必须实现的父类抽象函数
Python中提供了一种机制,可以让一个类无条件地挂载到一个抽象类上从而成为它的一个虚拟子类,注册之后不会从父类继承任何方法或属性,所以叫做虚拟子类

@BasicsCreateData.register
class CreateData():
    ...
    
    
# 或者
BasicsCreateData.register(CreateData)

由于虚拟子类不会继承父类任何方法属性,没有get到使用虚拟子类的意义,查阅相关文档,通过注册增加虚拟子类是抽象基类动态性的体现,也是符合Python风格的方式,理解为是一种风格约束或者说父类提供给子类所需的实现标注,像类型标注的name:AnyStr = 'l'

标签:__,子类,self,抽象,基类,data
From: https://www.cnblogs.com/Mickey-7/p/17296453.html

相关文章

  • Java基础知识点(抽象类)
    封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为。一:抽象方法和抽象类的定义将共性的行为(方法)抽取到父类之后,由于每一个子类执行的内容是不一样,所以,在父类中不能确定的具体的方法体,该方法就可以定义为抽象方法。抽象类:如果一个类中存在抽象方法,那么该类就必须声明抽象类。......
  • Java基础知识点(抽象类)
    封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为。一:抽象方法和抽象类的定义将共性的行为(方法)抽取到父类之后,由于每一个子类执行的内容是不一样,所以,在父类中不能确定的具体的方法体,该方法就可以定义为抽象方法。抽象类:如果一个类中存在抽象方法,那么该类就必须声明抽象类。......
  • 四、kubernetes-存储抽象
    1.先搭建nfs服务器2.每台节点都挂载nfs目录文件夹3.使用原生方式挂载的nfs数据,在pod删除后数据不会删除服务器原生方式挂载,将/usr/share/nginx/html挂载到nfs文件夹下apiVersion:apps/v1kind:Deploymentmetadata:labels:app:nginx-pv-demoname:nginx-pv-de......
  • java抽象类和接口
    abstract由abstract关键字修饰的类称为抽象类,可以将某些类共有的行为抽象出来,形成约束,提高开发效率。//抽象类publicabstractclassAction{//抽象方法,只有方法名字,没有方法的实现publicabstractvoiddoSth();}抽象类不可以通过new关键字创建实例抽象类中可以有......
  • Python抽象基类
     Python这门语言中,由于存在动态声明类属性的存在,我们很难说xxx是xxx,比如如何确定你正在处理的对象是一个列表?针对上面问题,我们可以使用isinstance(变量,list)的方式,如果得到True那么意味着变量是一个列表。但有时候我们并不是真的想得操作一个list,或者说如果我只想确认,我操作......
  • php Trait基类use trait,本类不use
    一回顾trait使用https://blog.csdn.net/bushuwei/article/details/103514174发现之前本人说明很模糊,自己居然不知道为什么其实这里的$c,就是classB再次回顾逻辑二分析self和static区别说的没毛病Trait基类usetrait,本类不use。那么如果用的newself,则你new出来的就是......
  • 抽象类和接口
    1、抽象类类的层次结构中,越往下继承的子类其属性和方法越来越具体。相反,越上层的祖先类其实现越抽象,甚至无法给出具体实现。例如,一个圆或矩形有面积,但祖先几何图形类的getArea()方法没法给出具体实现,这时可以定义为抽象方法。Java中可以定义不含方法体的方法,方法的方法......
  • 抽象,接口以及内部类
    抽象类特点:不能new这个抽象类,只能靠他的子类实现:约束!抽象类中可以有普通方法抽象方法必须在抽象类中抽象的抽象:约束接口普通类:只有具体的实现抽象类:具体......
  • C#中抽象方法与虚方法的区别详解及示例
    1.抽象方法与虚方法的区别  先说两者最大的区别:抽象方法是需要子类去实现的。虚方法是已经实现了的,可以被子类覆盖,也可以不覆盖,取决于需求。因为抽象类无法实例化,所以......
  • C#多态性学习,虚方法、抽象方法、接口等用法举例
    1.多态性定义  C#中的多态性是OOP(面向对象编程)的一个基本概念,它允许一个对象在不同情况下表现出不同的行为,以增强代码的可重用性和灵活性。  根据网上的教程,我们得......