2010-06-25 8 views
16

J'écris un programme pour trouver des adaptateurs, et j'ai créé une classe appelée 'Adapter'. Quand je passe en deux arguments IDLE me donne une erreur en disant que je suis passé en trois! Voici la trace de code et pile:Python: __init __() prend exactement 2 arguments (3 donnés)

#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 

Erreur: 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)

Je ne comprends pas quel est le problème parce que je ne l'ai entré dans deux args! Editer: Je suis nouveau dans le langage python, même si je connais Java. J'utilise cette page comme tutoriel: http://docs.python.org/tutorial/classes.html

+2

Votre définition de '__init__' est très fausse. Quel tutoriel utilisez-vous? Pourquoi avez-vous écrit ça? Pourquoi avez-vous omis la variable 'self'? Veuillez inclure le nom ou le lien vers le didacticiel que vous utilisez. –

+4

Votre utilisation des expressions de tuple dans votre liste d'arguments est très Python non-idiomatique et confondrait beaucoup de personnes. Je suggère que vous ne fassiez pas cela, d'autant plus que vous les avez simplement assignés comme un tuple à quelque chose d'autre de toute façon. S'il vous plaît, n'utilisez pas de constructions Python très bizarres mais étrangement fonctionnelles, sauf si vous avez une raison vraiment extravagante. – Omnifarious

+0

différentes personnes apprennent de différentes façons, vous pouvez trouver diveintopython.org plus approprié que docs.python.org – msw

Répondre

19

Oui, l'OP a raté le self, mais je ne sais même pas ce que ces tuples-en-arguments signifient et je suis volontairement pas prendre la peine de le comprendre, il est juste une mauvaise construction.

Codysehi, s'il vous plaît contraste avec votre code:

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

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

et voir qu'il est à la fois plus lisible, et fait ce que je pense que vous avez l'intention.

+0

Merci! Mon introduction à Python ne s'est pas déroulée aussi bien que je l'espérais: P Il me semble plus logique de passer maintenant deux variables en listes. – codysehl

+0

J'ai trouvé Python un peu déconcertant au début, et c'était avec des dizaines de langues sous ma ceinture. Nitpick utile: 'sideX' est lié à un tuple'() 'qui est immuable par opposition à une liste' [] 'qui est mutable. – msw

5

Votre __init__ devrait ressembler à ceci:

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

Méthode appels sont automatiquement un paramètre « auto » comme premier argument, donc faire __init__() regarder comme:

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

Ceci est généralement implicite dans d'autres langages, en Python il doit être explicite. Notez également que c'est juste une façon d'informer la méthode de l'instance à laquelle elle appartient, vous n'avez pas besoin de l'appeler 'self'.

+1

Expliqué plus loin dans le doc Python sur [Classes] (http://docs.python.org/tutorial/classes.html) –

+0

pour afficher correctement '__init__' dans la première ligne, vous devez placer des guillemets autour de celui-ci. Sinon, le double underscore le rend gras –

4

On dirait que c'est la façon dont Python dit bonjour à tous ceux qui apprennent la langue. Genre de la première morsure de Python.

Vous devez spécifier auto dans les méthodes d'instance en tant que premier argument. Donc ça devrait l'être.

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