2012-06-26 1 views
0

Il est mon script:# Erreur: TypeError: méthode non liée __init __() doit être appelée par exemple de forme comme premier argument (obtenu par exemple str à la place) n

class shape: 
    def __init__(self, name): 
     self.name = name 

    def printMyself(self): 
     print 'I am a shape named %s.' % self.name 

shape1 = shape(name = 'myFirstShape.') 
shape2 = shape(name = 'mySecondShape.') 
shape1.printMyself() 
shape2.printMyself() 


class polyCube(shape): 
    def __init__(self, name, length, width, height): 
     shape.__init__(name) 
     self.length = length 
     self.width = width 
     self.height = height 

    def printMyself(self): 
     shape.printMyself(self) 
     print 'I am also a cube with dimensions %.2f, %.2f, %.2f.' % (length, width, height) 


class polySphere(shape): 
    def __init__(self, name, radius): 
     shape.__init__(name) 
     self.radius = radius 

    def printMyself(self): 
     shape.printMyself(self) 
     print 'I am also a sphere with dimensions of %.2f.' % (radius) 

cube1 = polyCube('firstCube', 2.0, 1.0, 3.0) 
cube2 = polyCube('secondCube', 3.0, 3.0, 3.0) 
sphere1 = polySphere('firstSphere', 2.2) 
sphere2 = polySphere('secondSphere', 3.5) 
shape1 = shape('myShape') 
cube1.printMyself() 
cube2.printMyself() 
sphere1.printMyself() 
sphere2.printMyself() 

Mon erreur:

# Error: TypeError: unbound method __init__() must be called with shape instance as first argument (got str instance instead) # 

Je ne comprends pas. Pourquoi j'ai reçu ce message d'erreur? Quelle est la solution? Et pourquoi?

Merci!

Répondre

1

Une version de travail de votre code, je l'ai expliqué les erreurs dans les commentaires

class shape: 
    def __init__(self, name): 
    self.name = name 

    def printMyself(self): 
    print ('I am a shape named %s.' % self.name) 

shape1 = shape(name = 'myFirstShape.') 
shape2 = shape(name = 'mySecondShape.') 
shape1.printMyself() 
shape2.printMyself() 


class polyCube(shape): 
    def __init__(self, name, length, width, height): 
     shape.__init__(self,name) #pass self here, you're calling parent's __init__() explicitly so you should pass self. 

     self.length = length 
     self.width = width 
     self.height = height 

    def printMyself(self): 
    shape.printMyself(self) 
    #use self.length ,self.width instead of just length,width etc 
    print ('I am also a cube with dimensions %.2f, %.2f, %.2f.' % (self.length, self.width, self.height)) 


class polySphere(shape): 
    def __init__(self, name, radius): 
     shape.__init__(self,name) #pass self here 

     self.radius = radius 

    def printMyself(self): 
    shape.printMyself(self) 
    print ('I am also a sphere with dimensions of %.2f.' % (self.radius)) #use self.radius here 

cube1 = polyCube('firstCube', 2.0, 1.0, 3.0) 
cube2 = polyCube('secondCube', 3.0, 3.0, 3.0) 
sphere1 = polySphere('firstSphere', 2.2) 
sphere2 = polySphere('secondSphere', 3.5) 
shape1 = shape('myShape') 
cube1.printMyself() 
cube2.printMyself() 
sphere1.printMyself() 
sphere2.printMyself() 
+0

L'indentation entraînerait une IndentationError, pas une erreur TypeError dans ce cas. L'erreur d'indentation est presque certainement le résultat de copier/coller dans SO. – mgilson

+0

il y a aussi d'autres erreurs, comme 'self' n'est pas passé à' __init__' et il utilise simplement 'radius' au lieu de' self.radius' dans l'instruction print. –

+0

Merci beaucoup – Oldran

0

En général, vous devez afficher le plein retraçage. Cela rend les choses beaucoup plus faciles à déboguer. Le problème (autre que l'empreinte que je suis venu d'erreurs ASSUMER copier/coller) est lorsque vous appelez:

shape.__init__(name) 

lorsque vous héritez de forme.

Si vous regardez le "prototype" de shape.__init__, cela ressemble à shape.__init__(self,name) - C'est ce que vous devriez utiliser. L'erreur vient parce que vous passez name (une chaîne) où vous devriez être de passage self (un PolyCube et donc une shape due à l'héritage)

OPPOSITION

Aussi, en python 2.x , il est bon de toujours hériter de object. par exemple:

class shape(object): 
    ... 

Cela vous permet d'utiliser toutes les qualités associées aux classes de style nouveau. (en python 3, toutes les classes sont des classes de style nouveau)

+0

Merci pour l'explication – Oldran

Questions connexes