【问题标题】:How to extend Symbol class in sympy?如何在 sympy 中扩展 Symbol 类?
【发布时间】:2019-12-05 06:33:51
【问题描述】:

我无法在 sympy 中扩展 Symbol 类。这可能是一般类扩展的结果,也可能是这个特定的“符号”类的问题。

我想扩展 Symbol 类,使其具有一个名为“boolean_attr”的附加属性,它是一个 True/False 属性。这模拟了我正在尝试做的事情:

class A(object):  # This simulates what the "Symbol" class is in sympy

    __slots__ = ['a']

    def __init__(self, a):
        self.a = a


# this simulates my extension to add a property
class B(A):

    def __init__(self, boolean_attr):
        self. boolean_attr = boolean_attr

这似乎按预期工作:

my_B = B(False)
print my_B.boolean_attr
>>>> False

所以,当我在 Sympy 中尝试这个时,我就是这样做的:

from sympy.core.symbol import Symbol
class State(Symbol):

    def __init__(self, boolean_attr):
        self.boolean_attr = boolean_attr

但这不起作用:

TypeError: name should be a string, not <type 'bool'>

如何在 sympy 中为 Symbol 类添加属性?谢谢。

(另外,我应该提一下,这可能是xy problem,而我并不知道。我想知道如何为类添加属性,我的问题假设 扩展 类是最好的方法。如果这是一个不正确的假设,请告诉我)

【问题讨论】:

  • 请添加必要的导入以便我们运行代码和调试。
  • 当然好点。固定
  • 下面介绍的解决方案能解决您的问题吗?
  • 没有解决问题。

标签: python python-2.7 sympy python-object


【解决方案1】:

试试下面的代码,它适用于我在 python 3 上。

from sympy.core.symbol import Symbol
class State(Symbol):
    def __init__(self, boolean_attr):
        self.boolean_attr = boolean_attr
        super()

Python 2 代码:

from sympy.core.symbol import Symbol
class State(Symbol):
    def __init__(self, boolean_attr):
        self.boolean_attr = boolean_attr
        super(State, self).__init__()

【讨论】:

  • 不错!谢谢。但是我使用的是python2.7,2.7中有什么解决方案吗?你能说出其中的区别吗?即有什么理由它适用于新样式类而不是旧样式? (我猜这就是造成差异的原因,但如果我错了请告诉我)
  • 您在 python 2.7 中尝试过上述操作吗?有什么错误吗?
  • 据我所知,它在标签中。你在标签上看到了吗?
  • 伙计们,请继续在聊天中进行一对一讨论。
  • 请完整的堆栈跟踪,你当然可以链接到 pastebin
【解决方案2】:

通过更仔细地检查 SymPy 中的 Symbol 类,我能够解决此问题。 __new__ 方法将一个名为 'name' 的字符串作为输入,因此我们至少在子类中对 Super 的调用中需要它:

from sympy.core.symbol import Symbol
class State(Symbol):
    def __init__(self, name, boolean_attr):
        self.boolean_attr = boolean_attr
        super(State, self).__init__(name)

此外,不使用关键字参数,这会失败: State('x', True) 带有错误 TypeError: __new__() takes exactly 2 arguments (3 given) (https://pastebin.com/P5VmD4w4)

但是,如果我使用关键字参数,那么它似乎可以工作:

x = State('x', boolean_attr=True)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 2019-09-16
相关资源
最近更新 更多