1

我最近开始使用 Sage,我开始怀疑标准 Pythonint包装在一个名为IntegerSage 的自定义类中。如果我type(1)在 Python 中输入,<type 'int'>我会得到<type 'sage.rings.integer.Integer'>.

如果我想用我自己的自定义类替换 Python int(或listdict),该怎么做?会有多难(例如,我可以完全用 Python 完成)?

4

3 回答 3

2

您可以继承 Python 的所有内置类型。例如:

class MyInt(int):
    pass

i = MyInt(2)
#i is now an instance of MyInt, but still will behave entirely like an integer.

但是,您需要明确地说每个整数都是 MyInt 的成员。所以type(1)仍然会int,你需要做type(MyInt(1))

希望这接近您正在寻找的内容。

于 2012-04-29T21:43:48.907 回答
2

作为其他答案的补充:运行任何代码时,Sage 都有一个预处理步骤,将 Sage-Python 转换为真正的 Python(然后执行)。这是由preparse函数完成的,例如

sage: preparse('a = 1')
'a = Integer(1)'
sage: preparse('2^40')
'Integer(2)**Integer(40)'
sage: preparse('F.<x> = PolynomialRing(ZZ)')
"F = PolynomialRing(ZZ, names=('x',)); (x,) = F._first_ngens(1)"

这一步正是允许透明使用Integers(代替ints)和其他非标准语法(如上面的多项式环示例[a..b]等)的原因。

据我了解,这是完全透明地使用 Python 中内置类型替换的唯一方法。

于 2012-04-30T10:58:21.953 回答
1

在 Sage 的情况下,这很容易。Sage 可以完全控制自己的 REPL(读取-评估-打印循环),因此它可以解析您提供给它的命令,并将您的表达式部分转换为它想要的任何类。然而,让标准 Python 自动将整数类型用于整数文字并不容易。简单地将内置函数重新分配int()给其他类型是行不通的。您可能可以使用导入过滤器来执行此操作,该过滤器会扫描导入的每个文件以查找(例如)整数文字并将它们替换为MyInt(42)或其他内容。

于 2012-04-29T21:58:38.073 回答