Sympy的一个Bug,牵涉到Python多重继承问题

「SymPy」符号运算(1) 简介/符号/变量/函数/表达式/等式/不等式/运算符 「SymPy」符号运算系列第(1) 篇——SymPy简介、符号/变量、函数、表达式、等式/不等式、运算符 阅读详情

Sympy(gometry子包)中发现的一个bug

  • 问题来源:获取点到线段的距离。
  • 点到线段的距离与点到直线的距离不同,点到线段的最短距离并不一定是垂直距离。但是当使用sympy.geometry.line中的Segmnet类创建实例化的线段,并使用Segment类中的 distance() 方法获取 某个点到这条线段的距离时,发现无论点在何处,计算的始终是点到直线的距离(即垂直距离)。
p1_sym = sympy.geometry.point.Point(1, 0)
p2_sym = sympy.geometry.point.Point(0, 1)
p3_sym = sympy.geometry.point.Point(10, 0)
s1_sym = sympy.geometry.line.Segment(p1_sym, p2_sym)
print(s1_sym.distance(p3_sym))

结果输出为 9*sqrt(2)/2,这显然是不对的。
  • Debug后发现,调用distance() 方法,始终会跳至 Line 类中的distance() 方法,而不是 Segment 类中的 distance() 方法。究其原因,是因为Segment3D这个类继承了Segment, LinearEntity2D两个类,而 LinearEntity2D,有继承了Line类,最后就使用了Line 类中的distance() 方法。
sympy中Segment2D的继承
class Segment2D(LinearEntity2D, Segment):

将继承先后顺序修改,结果正确。继承顺序改为:

class Segment2D(Segment, LinearEntity2D):

看到这里,bug的原因找到了,是Python的多重继承问题引起的!!!

Python多重继承

新式类和经典类

  • Python3 中全部默认是新式类,新式类和经典类的多重继承关系不同。在菱形继承(或称钻石继承)中,经典类多继承属性搜索顺序: 先深入继承树左侧,若没有搜索到,开始找右侧;新式类多继承属性搜索顺序: 先水平搜索,然后再向上移动。
  • 更多经典类和新式类的区别,请自行检索,但个人认为没必要纠结于二者的区别,新式类是未来,掌握新式类就完全OK。

继承关系

这里多重继承牵涉到的都是新式类。

1. 简单多重继承
class Line():
    def distance(self):
        print('value of A')

class LinearEntity(Line):
    pass

class Segment():
    def distance(self):
        print('value of C')

class Segment2D(LinearEntity, Segment):
    pass

test = Segment2D()
test.distance()
打印结果 : value of A

更改Segment2D类对父类的继承顺序:

class Line():
    def distance(self):
        print('value of A')

class LinearEntity(Line):
    pass

class Segment():
    def distance(self):
        print('value of C')

class Segment2D(Segment, LinearEntity):
    pass

test = Segment2D()
test.distance()
打印结果 : value of c

结论:简单多重继承,先一直深入搜索左边,没有找到相关属性/方法,再搜索右边

2. 菱形继承

当一个子类继承2个父类,而2个父类又都继承一个基类,构成了一个菱形.
这里写图片描述

为验证菱形继承的继承关系,修改上面的代码,如下:

class Line():
    def distance(self):
        print('value of A')

class LinearEntity(Line):
    pass

class Segment(Line):
    def distance(self):
        print('value of C')

class Segment2D(LinearEntity, Segment):
    pass

test = Segment2D()
test.distance()
打印结果 : value of c

更改Segment2D类对父类的继承顺序:

class Line():
    def distance(self):
        print('value of A')

class LinearEntity(Line):
    pass

class Segment():
    def distance(self):
        print('value of C')

class Segment2D(Segment, LinearEntity):
    pass

test = Segment2D()
test.distance()
打印结果 : value of c

可以看到,不管继承先后,菱形继承关系中,都是先左右搜索,再上下搜索,即一层一层搜索。

文末语:文章大部分还是在自己的博客网站上发布,更多内容可移步我的个人网站 《浮生,奈若何》,www.linzhongya.top

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 01 算法设计 阅读详情

相关推荐

机器学习项目(四)疫情期间网民情绪识别 (一)

疫情期间网民情绪识别 赛题背景 2019新型冠状病毒(2019-nCoV)感染的肺炎疫情发生对人们生活生产的方方面面产生了重要影响,并引发国内舆论的广泛关注,众多网民参与疫情相关话题的讨论。为了帮助政府掌握真实社会舆论情况,科学高效地做好防控宣传和舆情引导工作,本赛题针对疫情相关话题开展网民情绪识别的任务。 数据介绍 训练集 10万条 无标记样本90万条 测试集1万条 数据集依据与“新冠肺炎”相关...

qq_33357094的博客 8970

彻底解决!SymPy完美幂函数深藏的3大缺陷与修复方案

SymPy作为一个用纯Python语言编写的计算机代数系统,为数学计算提供了强大的支持。然而,在幂函数的处理上,它存在一些不易察觉的缺陷,可能影响计算结果的准确性。本文将深入探讨SymPy幂函数的3大缺陷,并提供实用的修复方案,帮助你轻松应对数学计算挑战。 ## 缺陷一:矩阵幂运算结果异常 在处理矩阵幂运算时,SymPy可能会出现结果不符合预期的情况。这一问题主要体现在矩阵求幂的方法选择和计算

gitblog_00829的博客 353

从压电传感器到示波器:手把手教你用CA3140搭建电荷放大器(含PCB布局与调零技巧)

本文详细介绍了如何使用CA3140运算放大器搭建专业级电荷放大器,从压电传感器信号特性分析到PCB布局与调零技巧,全程实战演示。重点解析了CA3140的低通滤波器设计、反馈网络参数计算及抗干扰增强方案,帮助电子爱好者高效实现微弱电荷信号的稳定转换与测量。

weixin_31355483的博客 596

【SymPy】(一)SymPy简介

SymPy介绍 文章目录SymPy介绍1 什么是符号计算2 另一个例子3 SymPy强大之处 SymPy的全称为Symbolic Python,是一款用于符号运算的python库。 1 什么是符号计算 符号计算以符号的方式处理数学对象的计算。这意味着数学对象是精确表示的,而不是近似表示的,带有未赋值变量的数学表达式是以符号形式保留的。 举个例子。假设我们想使用内置的Python函数来计算平方根。我们可以这样做 In [1]: import math In [2]: math.sqrt(9) Out[2].

weixin_44378835的博客 1万+

别再用图片水印了!5种你可能不知道的文本隐写术实战

本文介绍了5种高效的文本隐写术,帮助创作者在不影响内容可读性的情况下嵌入版权信息。从零宽度字符到同形字替换,再到标点符号变形和行尾空格编码,这些技术为数字内容提供了轻量级版权保护方案,特别适用于社交媒体和电子合同等场景。

k8l9m0n的博客 225

【UE 反射】反射的原理是什么?如何使用机制?

静态类型检查确保了类型的早期一致性和高效的代码执行,但减少了灵活性。动态类型检查提供了更大的灵活性,但增加了运行时的开销和潜在的错误。反射作为一种动态特性,无论是在静态类型语言还是动态类型语言中,都提供了强大的运行时类型操作能力,但也伴随着性能和安全性方面的权衡。通过理解这些联系,开发者可以在不同的编程语言和应用场景中选择适合的类型检查方式和反射机制,以实现所需的动态行为和灵活性,同时保证性能和安全性。

hhw_hhw的博客 6032

快速入门 Python sympy 库:解决数学难题从此不再困扰!

Sympy 是一个纯 Python 的数学计算库,可以用于解决从初中数学到高级数学的各类问题。它支持符号计算、数值计算、代数运算、微积分、线性代数等功能,涵盖了数学、物理、工程等领域的大量应用。与 Matlab 等类似软件相比,Sympy 的优势在于其简洁的语法和丰富的第三方库生态,使得 Python 在科学计算领域更具竞争力。Python Sympy 库凭借其强大的数学计算功能、简洁的语法和丰富的第三方库,已成为广大 Python 开发者解决数学计算问题的必备工具。

白帽阿叁的博客 3679

FPGA资料分享——FPGA开发板入手指南

FPGA学习,开发板怎么选,看这里,就一个通透

weixin_51627076的博客 7297

用于符号数学的 Python 库——sympy(一)

SymPy 是用于符号数学的 Python 库。 它旨在成为功能齐全的计算机代数系统。 SymPy 包括从基本符号算术到微积分,代数,离散数学和量子物理学的功能。 它可以在 LaTeX 中显示结果。

飞华的博客 1782

资源分享·病毒样本下载资源分享

一、微步云沙箱 微步在线云沙箱https://s.threatbook.cn/ 使用病毒sha256即可寻找病毒样本;该站点也可上传可疑文件/可疑URL地址到沙箱中,进行分析 。 以永恒之蓝为例,样本sha256是:ed01ebfbc9eb5bbea545af4d01bf5f1071661840480439c6e5babe8e080e41aa 下载样本或流量监控,需要消耗积分: 二、AnyRun Interactive Online Malware Analysis Sandbox.

不忘初心,护天下安全! 2万+

网络变更:APIC 节点替换

Fabric Name,Controller ID,TEP Address Pool 等信息必须相同;如果故障设备是 APIC1 还需要重新配置管理密码。此过程可能需要 10 分钟左右,在此期间目标 APIC 可能在 Available/Unavailable 状态翻滚。APIC 获取 TEP 地址后,进入 fully-fit。通过 CLI 以及配置的密码登录目标 APIC。

m0_54931486的博客 318

python中sympy库的使用与示例!!!

Sympy是Python中的一个开源库,专注于符号计算。它提供了一套强大的工具,可以进行符号数学运算、代数操作、求解方程、微积分、矩阵运算等。

m0_73609188的博客 5322

Altium Designer(AD)PCB拼版——两种方法教程

本文详细介绍了PCB拼版的设计要点与操作方法。主要内容包括:拼版目的(解决小尺寸夹持问题、提高利用率、降低成本)和三大连接方式(V-CUT、邮票孔、空心连接条)的特点与参数设置;工艺边设计规范(宽度、定位孔、Mark点等要求);拼版尺寸限制与常见错误检查;以及两种具体拼版操作方法(特殊粘贴和拼版阵列),并附有工艺边、定位孔、Mark点的绘制步骤示意图。同时提供了硬件工程师笔试面试相关资源链接。全文系统阐述了PCB拼版的核心技术和操作流程,为电子设计人员提供了实用指导。

XU157303764的博客 7595

python3 核心笔记

本文主要是针对python3的一些核心要点做一些记录,感兴趣的可以关注和订阅。会持续更新,这个玩意学习一下,可以为数据分析和AI打下一定的基础。

yanghuashuiyue的专栏 617

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

模型蒸馏实战:用Qwen2.5-Math-1.5B实现本地化数学推理

模型蒸馏是一种将大模型知识高效迁移至小模型的关键技术,其核心在于通过logits分布、隐藏层特征与注意力机制三层协同,实现‘思维模式’而非仅‘答案输出’的继承。相比简单剪枝或量化,蒸馏能保留教师模型(如DeepSeek R1)在数学符号推理、多步代数推演等任务中的高阶认知能力,显著提升小模型在MATH、GSM8K等基准上的准确率与泛化性。该技术已广泛应用于VS Code插件、本地IDE助手及轻量级数学工具中,支撑低延迟(<350ms)、低显存(<2.1GB)的生产级部署。本文聚焦Qwen2.5-Math-1

weixin_34332905的博客 452

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

python中的SymPy库函数的运用

概念 sympy是一个Python的科学计算库,用一套强大的符号计算体系完成诸如多项式求值、求极限、解方程、求积分、微分方程、级数展开、矩阵运算等等计算问题。 常用的sympy内置符号 虚数单位i In [13]: import sympy In [14]: sympy.I Out[14]: I In [15]: sympy.I ** 2 Out[15]: -1 #求-1的平方根 In [16]: sympy.sqrt(-1) Out[16]: I 注;后面省略import sympy 自然对数的底

qq_51478930的博客 8811

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Python sympy用法(一)

SymPy使用教程,介绍表达式的用法和方程和方程组的求解。

JiangTao2333的博客 8255

sympy_python代数符号运算

SymPy 是一个符号计算的 Python 库,完全由 Python 写成,为许多数值分析,符号计算提供了重要的工具。它是一种计算机代数系统computer algebra system (CAS), 既可以用作单独的应用也可以作为其它的应用中的包。GitHub 链接:https://github.com/sympy/sympySymPy 官方网站:https://www.sympy.org/en/index.html。

哦豁灬 1万+

sympy,一个可以做数学题的Python库

sympy 是 symbolic python 的简称,也就是一个支持代数符号计算的python库。它可以用来帮助我们解决从初中数学到高等数学的各类问题,包括但不限于:⚫️ 表达式化简,因式分解,方程求解,不等式求解。⚫️ 求极限,求导,求积分,级数展开,解微分方程,级数求和。⚫️ 求概率,求期望,方差。⚫️ 矩阵乘法,求行列式,矩阵求逆,矩阵分解。本文将先演示sympy的基础使用范例,然后讲解s...

Python_Ai_Road的博客 1611

Python 中的Sympy详细介绍

我发现这个作者写的特别好,我就把它转载过来啦。 2、函数方程求解: 3、求和 解带有求和式的方程 : 4、求极限(注意,math包中sin和很多数学函数会报错,要用sympy中的,无穷大用 sympy.oo 表示) 5、求导 6、求定积分 还有其他方法。 上面的求法有点烂,难的就罢工不干了,我丢,还是喜欢scipy,如下: http://liao.cpython.or

Petrel__Cloud的博客 1万+

SymPy(python系列之——sympy库)

SymPy(python系列之——sympy库)

罗方涵的博客 1396

使用Python SymPy求解方程:从基础到高级应用

在科学计算和工程领域,求解方程是一项常见且重要的任务。Python的SymPy库提供了强大的符号计算功能,使得求解方程变得简单而高效。本文将详细介绍如何使用SymPy中的`sympy.solve()`函数来求解各种类型的方程,包括线性方程、多项式方程、超越方程以及方程组。我们还将探讨一些使用技巧和注意事项,帮助你更好地掌握这一工具。

neweastsun的专栏 2373

python之sympy库--数学符号计算与绘图必备

在实际进行数学运算的时候,其实有两种运算模式,一种是数值运算,一种是符号运算(代数)。而我们日常使用计算机进行数值运算,尤其是比如除、开平方等运算时,往往只能得到其近似值,最终总会已一定的误差,如果使用符号运算模式,则可以完全避免此种问题。 一、数学符号及符号表达式 符号表达式,区别于常规的数值型数学表达式,常规数学表达式,比如x+y*2等,基本x和y是一个变量,且变量最终也会被赋值,由变量组成的表达式,最后得出的也是一个数值。 而符号表达式,则真正的由符号组成,而符号无需提前赋值,由符号组成的表达式

yifengchaoran的专栏 17万+

python库(18):Sympy库

Python SymPy是一个强大的符号计算库,用于解决数学问题、代数运算、微积分、代数方程求解和符号化处理等任务。SymPy的设计目标是提供一个开源、可扩展的符号计算工具,使数学建模和问题求解变得更加容易。本文将提供关于Python SymPy的全面指南,包括基本概念、安装和配置、符号表达式、代数运算、微积分、方程求解、矩阵操作以及实际应用场景。将通过丰富的示例代码来帮助深入理解SymPy的使用。与我们常用的数学库NumPy不同,Sympy能够处理符号表达式,而不仅仅是数值计算。

u013938578的博客 2555

Sympy简单教程(1)

Python的符号计算工具包Sympy的简单教程

weixin_45616112的博客 2822

Python 第三方库:SymPy(符号计算工具)

SymPy 是 Python 中功能强大的符号计算(Computer Algebra)库,支持代数运算、微积分、方程求解、逻辑推理、矩阵运算等,并可将表达式输出为 LaTeX、MathML 或 C 代码。SymPy 提供多种变形函数,如 simplify()、expand()、factor()、collect() 等,帮助用户将表达式化简或变换成指定形式。可将符号表达式转为数值函数(如 .evalf(), lambdify()),与 NumPy、matplotlib 配合进行数值计算与可视化。

qq_41176800的博客 1193
下一篇: Pycharm连接远程服务器并实现远程调试
庸木
博客等级 码龄8年 19粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值