python 实现 抽象基类 abc模块

news/2024/5/19 2:26:54 标签: python, 反射

抽象基类(abc模块)
抽象基类介绍
抽象基类(abstract base class,ABC):抽象基类就是类里定义了纯虚成员函数的类。纯虚函数只提供了接口,并没有具体实现。抽象基类不能被实例化(不能创建对象),通常是作为基类供子类继承,子类中重写虚函数,实现具体的接口。
抽象基类就是定义各种方法而不做具体实现的类,任何继承自抽象基类的类必须实现这些方法,否则无法实例化。
起名字时不要把模块名起为abc.py,因为abc基类的原因,那时候就会冲突
应用场景:
1.我们去检查某个类中是否有某种方法
2.我们需要强调某个子类必须实现某些方法

  • 1.检查某个类中是否有某种方法:
  • 以len为例子
  • 一种方式是通过反射实现的:
python">class Demo(object):
    def __init__(self,li):
        self.li = li

    def __len__(self):
        return len(self.li)


l = ['a','n','c']
d = Demo(l)
print(len(d))   #触发return len(self.li)   返回了3
print(d.li)

#如何判断一个类中是否有某个属性?
print(hasattr(d,'__len__'))

第二种方式是通过抽象基类实现的:

python">class Demo(object):
    def __init__(self,li):
        self.li = li

    def __len__(self):
        return len(self.li)


l = ['a','n','c']
d = Demo(l)
print(len(d))   #触发return len(self.li)   返回了3
print(d.li)



from _collections_abc import Sized
print(isinstance(d,Sized))

#可以通过判断d是Sized的子类进而判断d是否含有len方法
#_collections_abc.py中搜Sized
# @classmethod
#     def __subclasshook__(cls, C):
#         if cls is Sized:
#             return _check_methods(C, "__len__")
#         return NotImplemented


可以通过判断d是Sized的子类进而判断d是否含有len方法
因为在这个定义中Sized的子类都含有len方法,是Sized的子类就含有len方法
_collections_abc位置:
/python路径/Lib/_collections_abc.py 不过该文件为隐藏文件,需要看时要设置查看隐藏文件

2.我们需要强调某个子类必须实现某些方法
如果没有重写某个方法的话就会抛出异常
实现的方式:
第一种方式:在父类定义,设置主动抛出异常
第二种方式:在父类中通过继承抽象基类实现抛异常

第一种方式代码:

python">'''
强制子类必须实现父类的方法
• 定义父类Cache
• 封装CRUD方法。强制子类重写该方法。
子类如果不重写该方法,就会报错
• 定义子类Redis
方式1:利用抛异常的方式

'''

class Cache(object):

    def dele(self):
        pass
        #raise NotImplementedError

    def crea(self):

        raise NotImplementedError

class Redis(Cache):
    def crea(self):
        pass

r = Redis()
r.crea()
r.dele()

这种实现方式有其固有的缺点:只有当调用该方法时才会抛出异常,在实例化的时候 并不会有提示

第2种方式:
通过继承抽象基类的方式:

python">#此时只要新建实例,如果没有重写就会报错,而第一种的抛异常只有我们访问这个方法时才抛出异常,如果不访问就不会有影响
#抽象基类的方式   在实例化时如果发现没有重写就会抛出异常

import abc

class Cache(metaclass=abc.ABCMeta):
    #直接继承抽象基类
    #装饰器
    @abc.abstractmethod
    def dele(self):
        pass
        #raise NotImplementedError

    def crea(self):
        pass
        #raise NotImplementedError

class Redis(Cache):
    def crea(self):
        print('lcy')

    def dele(self):
        print('dele')

r = Redis()

http://www.niftyadmin.cn/n/1684935.html

相关文章

GUI编程:打开文件对话框、保存文件对话框、颜色选择对话框的使用

打开文件对话框、保存文件对话框、颜色选择对话框的使用 import tkinter as tk #导入tkinter模块 import tkinter.scrolledtext as tst class Application(tk.Frame): #定义GUI类,派生于Frame类def __init__(self,masterNone): tk.Frame.__init__(self,ma…

python type和 isinstance is and ==

type:查看一个对象的类型isinstance:查看是不是某个类的实例isinstance()#考虑继承关系,我附庸的附庸也是我的附庸type()#不考虑继承关系的,我附庸的附庸不是我的附庸直接上代码: class Father(object):passclass Son(Father):passls Son()…

多继承 查看继承顺序的‘__mro__’魔法方法

class D(object):passclass B(D):passclass C(D):passclass A(B,C):passprint(A.__mro__)可以通过__mro__魔法方法查看多继承的顺序

GUI编程:菜单的操作

实现菜单和弹出式菜单的各项功能 import tkinter as tk import tkinter.scrolledtext as tst class Application(tk.Frame):def __init__(self,masterNone): #构造函数tk.Frame.__init__(self,master)self.grid()self.createWidgets() #声明对象方法,创建子组件s…

python 多线程 互斥锁和死锁

在上一节提到的资源抢占的问题,那么这个问题如何解决呢?互斥锁就可以解决这个问题: 资源抢占的问题原因在于两个线程操作同一个资源,此时这个资源的内容就混乱了,对于两个线程都不能正常服务 此时就可以考虑在一个线程…

在画布上实现正弦曲线和文字的绘制

在画布上实现正弦曲线和文字的绘制 from tkinter import * import math WIDTH400;HEIGHT210 #画布的宽度和高度 ORIGIN_X2;ORIGIN_YHEIGHT/2 #原点x,y SCALE_X40;SCALE_Y100 #x,y轴缩放倍数 END_ARC360*2 #画多长 ox0;oy0;x0;y0 #坐标初始值 arc0 …

python实现死锁和重入锁

在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。 import threading import timeclass MyThread1(threading.Thread):def run(self):# 对mutexA上锁mutexA.acquire()# mutexA上锁后,延时1秒…

Eclipse的安装

用Eclipse集成开发环境开发JAVA程序 1.在http://www.eclipse.org/downloads/下载Eclipse的如下版本的程序包: 2.在http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html下载JRE的如下版本的可执行文件 3.先安装jre-8u51-windows-…