Python提示 TypeError: super(type, obj): obj must be an instance or subtype of type问题

2023-11-04

Python提示 TypeError: super(type, obj): obj must be an instance or subtype of type问题

  1. 简述问题

在工作中有一天将debug下正常工作的python代码编译之后运行却抛出异常,提示“TypeError: super(type, obj): obj must be an instance or subtype of type”,引起这个问题的原因是因为type和obj类型不一致造成的(即obj对象不是由type类型的类创建的),但是debug下是工作的啊,突然想到会不会是由于编译后使用了pyd模块,模块加载时出现了问题。

为了找到错误的原因,构建了测试代码复线了错误过程,重复导入模块,对于pyd模块在使用api load_module时必须使用该模块的名称导入,否则会导入失败,但是有时必须要修改名称,因为在不同的目录下或许会有相同名称但功能不同的模块,如果不修改名称后面导入的模块会覆盖之前导入的模块,见图1.1 测试代码。

现在的问题是修改了名称,但是现在发现可能还是存在覆盖导入的问题,在第二次导入后会使第一次成功创建的对象在方法内调用super()时抛出“TypeError: super(type, obj): obj must be an instance or subtype of type”异常,见图1.1 测试代码。

1.1 测试代码

  1. 问题原因

1. 可能是因为在导入“a”后触发的(因为名称一样都是a)reload操作修改了a模块对象,由于存在引用(可能有部分不可见的数据结构),同时也影响了‘a1’模块对象内部的部分数据?从而导致奇怪的异常。

2. 能是因为在导入“a”后触发的(因为名称一样都是a)reload操作修改了a模块对象导致pyhton 解释器在解释的时候将a和a1模块都一律按照reload后的模块来解释。

简单验证上面的说法,在项目的根目录下新建名为a、b的文件夹,分别放置a.pyd模块,模块内的测试代码见图2.1,这段程序执行到16行的时候错误,错误提示当前对象的类型与类的类型不一致(说明当前对象不是这个类的实例),当然这个错误是出现在重复导入a模块之后,在这之前调用get方法并没有出现异常,见图2.2。

2.1 a.pyd模块源文件

2.2 测试代码1

下面这个测试是分别通过a1_module.B类创建b_obj对象,re_a_module.B类创建re_b_obj对象,通过内部打印id,显示它们的id是一致的,都是76028552,即为re_a_module.B类的id,表明python解释器在内部解释时,将之前第一次导入的类也解释成后面重载的类,导致了实例化调用super时抛出TypeError。综上所述,假设2成立,见图2.3。

2.3 测试代码2

  1. 解决方案
    1. 模拟案例

经过分析,我认为只要不引起模块的reload就能够避免该问题,故在第一次导入模块后从系统模块字典中pop出‘a’模块,导出的模块以‘a1’为键更新到sys.modules中,就能够解决上述问题。例:sys.modules.update({'a1': sys.modules.pop('a')});见图3.1。

3.1 模拟案例解决方案

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python提示 TypeError: super(type, obj): obj must be an instance or subtype of type问题 的相关文章

随机推荐

  • API hook 原理与Windows hook 应用

    API hook 原理与Windows hook 应用 分类 系统程序 2012 04 14 12 20 3679人阅读 评论 3 收藏 举报 hook api windows attributes descriptor winapi 目录
  • seaborn.heatmap部分参数解释

    今天也是自己用seaborn的heatmap花了一个混淆矩阵 sns heatmap ConfusoinMatrix annot True ax ax cmap Greens 发现他这个对数据倾斜的数据很不友好啊 如果有一个类别的数据超级多
  • SystemC自带example的simple_perf研习

    simple perf SystemC的性能建模示例 也是SystemC中系统级建模的一个入门简介 SystemC自带example的系列 SystemC自带example的pipe研习 SystemC自带example的pkt switc
  • fabric1.0 错误分析总结

    个人在学习 fabric1 0 项目中遇到的 一些 错误和原因总结 如发现错误即时指出 1 ERROR could not find an available non overlapping IPv4 address pool among
  • 用Rancher RKE快速部署高可用k8s集群

    用Rancher部署高可用k8s集群 用Rancher RKE部署高可用k8s集群 1 主机配置 1 1 新建虚拟主机 1 2 主机初始化配置 安装一些必要的安装包 安全设置 ntp时钟同步 内核参数调优 hostname修改 关闭swap
  • 诠释韧性增长,知乎Q3财报里的社区优势和商业化价值

    当内容平台开始做生意 往往意味着它要扮演一个大包大揽的角色 从内容的可持续性到最终变现 设计一套完整的生态系统是必需的 但并非所有平台都对此感到棘手 或者说在某些平台 生态已经不是困难 而是优势和特色 知乎就是从好平台走向好公司的典型例子
  • scrapy中使用css选择器罗列下一级的所有标签

    使用 css dl gt 即为罗列dl标签的下一级所有标签 例子 dt dl a dl dl b dl dl h1 c h1 dl dt 使用 data dt response css dl dt id all child elements
  • Python-Tkinter 图形化界面设计

    摘抄来自Python Tkinter 图形化界面设计 还是自己去看一下比较好 我只是摘抄我用的上的 一 最基本框架 from tkinter import root Tk root title 我的第一个Python窗体 root geom
  • P2524 Uim的情人节礼物·其之弐【康托展开模板题】

    题目链接 我在这里加了树状数组来优化康托展开 但是这道题的数据其实很小 不需要加也是可以的 include
  • 27 类深度学习主要神经网络

    1 感知器 Perceptron P 感知器模型也称为单层神经网络 这个神经网络只包含两层 输入层 输出层 这种类型的神经网络没有隐藏层 它接受输入并计算每个节点的加权 然后 它使用激活函数 大多数是Sigmoid函数 进行分类 应用 分类
  • 49 题目 1431: [蓝桥杯][2014年第五届真题]分糖果

    题目 1431 蓝桥杯 2014年第五届真题 分糖果 时间限制 1Sec 内存限制 128MB 提交 5807 解决 2969 题目描述 问题描述 有n个小朋友围坐成一圈 老师给每个小朋友随机发偶数个糖果 然后进行下面的游戏 每个小朋友都把
  • Python中Requests模块的异常值处理

    在我们用Python的requests模块进行爬虫时 一个简单高效的模块就是requests模块 利用get 或者post 函数 发送请求 但是在真正的实际使用过程中 我们可能会遇到网络的各种变化 可能会导致请求过程发生各种未知的错误导致程
  • Vue中的路由以及默认路由跳转

    文章目录 官方网址 Vue路由配置 安装 引入并使用 配置路由 官方网址 https router vuejs org Vue路由配置 安装 npm install vue router save 或者 cnpm install vue r
  • SpringBoot集成XxlJob分布式任务调度中心(超详细之手把手教学)

    一 前言 废话就不多说了 介绍Xxl Job的网上已经有很多 本文就不多加复制粘贴了 直接步入第二步 PS 本文包括Xxl Job分布式定时任务调度中心的搭建 以及SpringBoot集成XxlJob的全过程 如果不想了解搭建的小伙伴可以直
  • 判断加密方式

    如何判断密文的加密方式 1 如果密文是十进制 字符范围是 0 9 可以猜测是ASCII编码 2 如果密文由 a z A Z 和 构成 特别是末尾有 那么判断可能是Base64编码 Base64在线解码网址 BASE64加密解密 3 如果密文
  • Docker 部署 RocketMQ

    文章目录 安装nameserver 拉取镜像 运行容器 出现问题卸载 安装broker 创建配置文件 运行容器 出现问题卸载 安装控制台 拉取镜像 运行容器 出现问题卸载 安装nameserver 拉取镜像 docker pull rock
  • 时序预测

    时序预测 MATLAB实现ARIMA时间序列预测 armax函数 本程序基于MATLAB的armax函数实现arima时间序列预测 实现了模型趋势分析 序列差分 序列平稳化 AIC准则模型参数识别与定阶 预测结果与误差分析过程 逻辑清晰 数
  • 【NLP实践】使用Pytorch进行文本分类——BILSTM+ATTENTION

    目录 网络结构 代码实现 Attention计算 模型效果 调参 相关文章 网络结构 代码实现 class TextBILSTM nn Module def init self config TRNNConfig char size 500
  • 学习Vue 之 创建一个 Vue 应用

    文章目录 Vue js 概述 了解 Vue 创建一个 Vue 应用 参考 Vue js 概述 计划学习前端 已有一些HTML js CSS的基础知识 下一步学习Vue js 以下是一些适合新手的Vue js教程 你可以根据自己的实际情况和需
  • Python提示 TypeError: super(type, obj): obj must be an instance or subtype of type问题

    Python提示 TypeError super type obj obj must be an instance or subtype of type问题 简述问题 在工作中有一天将debug下正常工作的python代码编译之后运行却抛出