2010-06-25 12 views
16

Estoy escribiendo un programa para encontrar adaptadores y he creado una clase llamada 'Adaptador'. Cuando paso dos argumentos ¡IDLE me da un error al decir que pasé en tres! Aquí está el código y Seguimiento de la pila:Python: __init __() toma exactamente 2 argumentos (3 dados)

#This is the adapter class for the adapter finder script 

class Adapter: 
    side1 = (None,None) 
    side2 = (None,None) 
    '''The class that holds both sides of the adapter''' 
    def __init__((pType1,pMF1),(pType2,pMF2)): 
     '''Initiate the adapter. 

     Keyword Arguments: 
     pType1 -- The passed type of one side of the adapter. ex: BNC, RCA 
     pMF1 -- The passed gender of pType1. ex: m, f 

     pType2 -- The passed type of one side of the adapter. ex: BNC, RCA 
     pMF2 -- The passed gender of pType2. ex: m, f 

     ''' 

     print 'assigining now' 
     side1 = (pType1,pMF1) 
     print side1 
     side2 = (pType2,pMF2) 
     print side2 

sideX = ('rca','m') 
sideY = ('bnc','f') 

x = Adapter(sideX,sideY) 
print x.side1 
print x.side2 

error: Traceback (most recent call last): File "C:\Users\Cody\Documents\Code\Python\Adapter Finder\adapter.py", line 28, in <module> x = Adapter(sideX,sideY) TypeError: __init__() takes exactly 2 arguments (3 given)

No entiendo cuál es el problema porque sólo he entrado dos argumentos!

Editar: Soy nuevo en el lenguaje python, aunque conozco Java. estoy usando esta página a modo de tutorial: http://docs.python.org/tutorial/classes.html

+2

Su definición de '__init__' está muy, muy mal. ¿Qué tutorial estás usando? ¿Por qué escribiste eso? ¿Por qué omitiste la variable 'self'? Por favor incluya el nombre o enlace al tutorial que está usando. –

+4

Su uso de expresiones de tupla en su lista de argumentos es Python muy idiomático y podría confundir a muchas personas. Sugiero que no hagas eso, especialmente porque los asignas como una tupla a otra cosa de todos modos. Por favor, no uses construcciones de Python muy extrañas pero que funcionen extrañamente a menos que tengas una razón realmente escandalosamente fantástica para hacerlo. – Omnifarious

+0

diferentes personas aprenden de diferentes maneras, puede encontrar que diveintopython.org es más adecuado que docs.python.org – msw

Respuesta

19

Sí, el PO perdió la self, pero ni siquiera saben lo que como argumentos-tuplas-significan esos e intencionalmente no estoy molestando a la figura hacia fuera, es sólo una mala construcción.

Codysehi, por favor contraste con su código:

class Adapter: 
    def __init__(self, side1, side2): 
     self.side1 = side1 
     self.side2 = side2 

sideX = ('rca', 'm') 
sideY = ('bnc', 'f') 
x = Adapter(sideX, sideY) 

y vea que es tanto más fácil de leer, y hace lo que creo que tenía planeado.

+0

¡Gracias! Mi introducción a Python no ha ido tan bien como esperaba: P Tengo más sentido para mí ahora solo pasar dos variables como listas. – codysehl

+0

Al principio encontré a Python un poco desconcertante, y esto era con docenas de idiomas en mi haber. Nitpick útil: 'sideX' está ligado a una tupla'() 'que es inmutable a diferencia de una lista' [] 'que es mutable. – msw

5

Su __init__ debería tener este aspecto:

def __init__(self,(pType1,pMF1),(pType2,pMF2)): 
13

método llama obtendrá automáticamente un parámetro de 'yo' como primer argumento, así que __init__() mira como:

def __init__(self, (pType1,pMF1),(pType2,pMF2)): 

Esto suele estar implícito en otros idiomas, en Python debe ser explícito. También tenga en cuenta que, en realidad, es solo una forma de informar el método de la instancia a la que pertenece, no tiene que llamarlo 'auto'.

+1

Explicado más adelante en el documento de Python en [Clases] (http://docs.python.org/tutorial/classes.html) –

+0

para que '' __init__' se muestre correctamente en la primera línea, debe colocar los palos de atrás a su alrededor. De lo contrario, el guión bajo doble lo hace audaz –

4

Parece que esta es la forma en que Python saluda a todos los que aprenden el idioma. Tipo de primer bocado de Python.

Tiene que especificar auto en métodos de instancia como primer argumento. Entonces debería ser.

def __init__(self, (pType1,pMF1),(pType2,pMF2)): 
Cuestiones relacionadas