Python Classe com emulação inteiro
-
08-07-2019 - |
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
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.