Pergunta

Dada é exemplo a seguir:

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

    def __int__(self):
        return self.value

Eu quero ter uma classe Foo , que atua como um inteiro (ou float). Então, eu quero fazer o seguinte:

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

O primeiro print int(f)+5 declaração está trabalhando, porque existem dois inteiros. O segundo está falhando, porque eu tenho que implementar __add__ para fazer esta operação com a minha turma.

Assim, para implementar o comportamento inteiro, eu tenho que implementar todos os métodos do inteiro emulando. Como eu poderia contornar isso. Eu tentei herdar de int, mas esta tentativa não foi bem sucedida.

Atualizar

Herdando de int falhar, se você quiser usar um __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)

Se você, em seguida, ligue para:

f=Foo(some_argument=3)

você obtém:

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

Testado com Python 2.5 e 2.6

Foi útil?

Solução

Você precisa __new__ substituição, não __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

Agora, o seu trabalho de classe como esperado:

>>> 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

Mais informações sobre a substituição new pode ser encontrada no tipos Unificar e classes em Python 2.2 .

Outras dicas

Em Python 2.4 + herança de obras int:

class MyInt(int):pass
f=MyInt(3)
assert f + 5 == 8

Tente usar uma versão up-to-date de python. Seu código funciona em 2.6.1.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top