2011-01-28 28 views
6
# Python 3 
class Point(tuple): 
    def __init__(self, x, y): 
     super().__init__((x, y)) 

Point(2, 3) 

resultaría enproblema de subclases incorporado tipo

TypeError: tuple() takes at most 1 argument (2 given)

¿Por qué? ¿Qué debería hacer?

+2

posible duplicado de [tupla subclases Python con múltiples argumentos __init__] (http://stackoverflow.com/questions/1565374/subclassing-python-tuple-with-multiple-init-arguments) –

Respuesta

10

tuple es un tipo inmutable. Ya está creado e inmutable antes de llamar al __init__. Es por eso que esto no funciona.

Si realmente quiere subclasificar una tupla, use __new__.

>>> class MyTuple(tuple): 
...  def __new__(typ, itr): 
...    seq = [int(x) for x in itr] 
...    return tuple.__new__(typ, seq) 
... 
>>> t = MyTuple((1, 2, 3)) 
>>> t 
(1, 2, 3) 
+1

Ah, por lo que mi 'Point (2,3)' busca un método '__new__' en' Point', no lo encuentra, invoca 'tuple .__ new __ (Point, 2,3)' que falla ya que no pasa simplemente el número arbitrario de argumentos para '__init__' como una clase definida por el usuario, pero en realidad requiere un solo iterador para inicializar apropiadamente' tuple', ¿correcto? El código ni siquiera llega a la llamada 'Point .__ init __ (self, 2, 3)'; esa llamada, si ocurriera, sería incorrecta también ya que 'tuple' no tiene' __init__', y entonces 'object.__ init__' simplemente no haría nada en silencio? – max

+0

Sí exactamente. El objeto ya ha sido creado. – user225312