如何在Python类中传递符号属性?解决sympy的TypeError报错
问题分析与解决
错误原因
你代码里的核心问题有两个:
sp.symbols("self.x")不会读取实例的self.x属性,而是创建一个名为"self.x"的单个符号,同理sp.symbols("self.y")也是单个符号,两者相乘得到的是单个Mul对象,而sum()函数要求传入可迭代对象(比如列表、数组),直接对单个Mul对象调用sum就会抛出TypeError: 'Mul' object is not iterable。- 你没有将传入的字符串数组(
ax、by)里的每个元素转换为对应的sympy符号,也没有实现对应元素相乘后求和的逻辑。
修复后的代码
import sympy as sp import numpy as np class Sym_Class: def __init__(self, x, y): # 将输入的字符串数组批量转换为sympy符号 self.x_symbols = sp.symbols(x) self.y_symbols = sp.symbols(y) def sumsymbol(self): # 遍历对应符号对,计算乘积项后求和 product_terms = [x * y for x, y in zip(self.x_symbols, self.y_symbols)] total_sum = sum(product_terms) print(total_sum) ax = np.array(['x1', 'x2', 'x3']) by = np.array(['y1', 'y2', 'y3']) cc1 = Sym_Class(ax, by) cc1.sumsymbol()
代码说明
sp.symbols(x)可以直接接收字符串数组(或列表),批量创建对应的sympy符号,比如传入['x1','x2','x3']会生成(x1, x2, x3)这三个符号组成的元组。- 用
zip将两个符号序列配对,生成每个xi*yi的乘积项,再用sum()对这些乘积项求和,得到最终的符号表达式。
运行修复后的代码,会输出:x1*y1 + x2*y2 + x3*y3,符合你的需求。
内容的提问来源于stack exchange,提问作者Z. K
相关产品推荐
相关产品推荐

