代码之家  ›  专栏  ›  技术社区  ›  Günther Jena

带整数模拟的python类

  •  5
  • Günther Jena  · 技术社区  · 15 年前

    以下是示例:

    class Foo(object):
        def __init__(self, value=0):
            self.value=value
    
        def __int__(self):
            return self.value
    

    我想去上课 ,用作整数(或浮点)。所以我想做以下事情:

    f=Foo(3)
    print int(f)+5 # is working
    print f+5 # TypeError: unsupported operand type(s) for +: 'Foo' and 'int'
    

    第一句话 print int(f)+5 正在工作,因为有两个整数。第二个失败了,因为我必须执行 __add__ 和我的班一起做这个手术。

    所以为了实现整数行为,我必须实现所有整数模拟方法。我怎么能避开这个。我试图继承 int ,但此尝试未成功。

    更新

    继承 利息 如果要使用 __init__ :

    class Foo(int):
        def __init__(self, some_argument=None, value=0):
            self.value=value
            # do some stuff
    
        def __int__(self):
            return int(self.value)
    

    如果您随后打电话:

    f=Foo(some_argument=3)
    

    你得到:

    TypeError: 'some_argument' is an invalid keyword argument for this function
    

    用python 2.5和2.6测试

    3 回复  |  直到 8 年前
        1
  •  5
  •   Pär Wieslander    15 年前

    你需要重写 __new__ 不是 __init__ :

    class Foo(int):
        def __new__(cls, some_argument=None, value=0):
            i = int.__new__(cls, value)
            i._some_argument = some_argument
            return i
    
        def print_some_argument(self):
            print self._some_argument
    

    现在你的班按预期工作:

    >>> f = Foo(some_argument="I am a customized int", value=10)
    >>> f
    10
    >>> f + 8
    18
    >>> f * 0.25
    2.5
    >>> f.print_some_argument()
    I am a customized int
    

    有关重写的详细信息 new 可以在中找到 Unifying types and classes in Python 2.2 .

        2
  •  7
  •   Heikki Toivonen    15 年前

    在python 2.4+中,从int works继承:

    class MyInt(int):pass
    f=MyInt(3)
    assert f + 5 == 8
    
        3
  •  2
  •   jdb    15 年前

    尝试使用最新版本的python。您的代码在2.6.1中有效。