我最近开始玩Sage,我开始怀疑标准Python int
是否包含在Sage中名为Integer
的自定义类中。如果我在Python中键入type(1)
,我会得到<type 'int'>
,但是,如果我在sage提示符中键入相同的内容,我会得到<type 'sage.rings.integer.Integer'>
。
如果我想用我自己的自定义类替换Python int
(或list
或dict
),那该怎么办呢?这有多难(例如,我可以完全用Python完成吗?)
答案 0 :(得分: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))
。
希望这与您正在寻找的相近。
答案 1 :(得分: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)"
这一步恰好允许透明地使用Integer
s(代替int
s)和其他非标准语法(如上面的多项式环示例和[a..b]
等)。
据我所知,这是在Python中完全透明地使用内置类型替换的唯一方法。
答案 2 :(得分:1)
在Sage的情况下,这很容易。 Sage可以完全控制自己的REPL(读取 - 评估 - 打印循环),因此它可以解析您提供的命令,并将表达式的各个部分放入所需的任何类中。但是,标准Python自动将整数类型用于整数文字并不容易。简单地将内置int()
重新分配给其他类型将不会这样做。您可以使用导入过滤器来执行此操作,该过滤器会扫描为(例如)整数文字导入的每个文件,并用MyInt(42)
或其他任何内容替换它们。