2010-01-17 3 views
1

J'ai deux classes:Comment bien imprimer?

class Dog(object): 
    def __init__(self, name): 
     self.name = name 
class Toy(object): 
    def play(self): 
     print "Squeak!" 

J'ai besoin de trouver une méthode appelée jeu (auto, jouet, n) pour chien de classe. Il imprime "Yip!" (Avec un espace) suivi de la sortie de toy.play sur la même ligne. Cela arrive n fois, avec les n sorties sur des lignes séparées. Si n est négatif, il est le même que si elle était 0.

Ce que je fait est

def play(self, toy, n): 
    count = 1 
    if n > 0: 
     while count <= n: 
      print "Yip! %s " % Toy().play() 
      count += 1 
    else: 
     print None 

Cependant, quand je l'appelle Chien (« grand »). Jouer (jouet, 3) ou tout n est, il montre que Squeak! Yip! Aucun Squeak! Yip! Aucun Squeak! Yip! Aucun Je ne sais pas ce qui ne va pas. Hurler! et Yip! devrait supposer être à la même ligne alors qu'il y a maintenant séparé et l'ordre devrait être opposé. Et pourquoi il y a un Aucun? Quelqu'un peut-il m'aider s'il vous plaît?

Répondre

1

Dans votre exemple appel, Dog('big').play(0), vous n'êtes pas passer l'argument toy - c'est ce qu'il se plaint de! Passer un argument de jouet avant n et ce sera mieux.

Ensuite, vous pouvez commencer à résoudre les bugs dans votre implémentation play: pourquoi faites-vous un nouveau jouet plutôt que d'utiliser l'argument, pourquoi imprimez-vous 'None' lorsque cela ne fait pas partie des spécifications, comment vous imprimez inutilement le retour valeur de la méthode Toy.play (qui renvoie None, implicitement) plutôt que de travailler avec le fait que cette dernière méthode est print quelque chose, et n'incrémentant jamais count et finissant ainsi dans les boucles infinies. (quatre bogues sérieux dans huit lignes plus un dans l'appel doit juste être une sorte d'enregistrement, je crois ;-).

BTW, les devoirs sont normalement marqués avec l'étiquette homework, pas exercise. (Et, il ya un autre bogue dans le titre de votre Q, comme classmethod est réellement autour, juste une bonne vieille plaine et parfaitement normale instance méthode).

+0

Eh bien, je suis désolé, je fait que beaucoup d'erreurs. Mais je n'apprécie pas ton idée. Pourriez-vous s'il vous plaît expliquer plus explicitement comment devrais-je réparer le jeu(). Quand je passe t = Toy(), alors appelez Dog ('big'). Play (t, 3), ça se voit, Squeak! séparateur ligne Yip! Aucun Squeak! séparateur ligne Yip! Aucun Squeak! séparateur ligne Yip! Aucun Cependant, je veux atteindre, Yip! Squeak!/N Yip! Grincer!/ n Yip! Grincer!. – timy

+0

@timy, il est donc clair que vous devez d'abord imprimer Yip sans fin de ligne (une virgule de fin sur l'instruction 'print' le fera bien sûr), puis appelez' toy.play() '(qui imprime le reste de la ligne et la nouvelle ligne à la fin). –

0

La première chose que je vois mal est que vous essayez d'appeler la classe 'Toy' au lieu de la variable représentant l'instance 'toy' passée à votre méthode 'play'. Je ne crois pas que vous pouvez instancier une classe et appeler une de ses méthodes en même temps, ce que 'Toy(). Play()' essaie de faire. L'autre est que je ne suis pas sûr de comprendre ce que vous essayez de faire avec la conception de vos cours. Voici comment je voudrais implémenter les classes et ensuite les utiliser pour obtenir votre comportement désiré.

class Toy(object): 
    def play(self): 
      return "Squeak!" 

class Dog(object): 
    speak = 'Yip! %s' 

    def __init__(self, name, toy): 
     self.name = name 
     self.toy = toy 

    def play(self,n): 
     if n > 0: 
      for each in range(n): 
       print(self.speak % self.toy.play()) 
     else: 
      print(None) 

et voici comment j'utiliser

Python 2.6.4 (r264:75821M, Oct 27 2009, 19:48:32) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from toy import Toy, Dog 
>>> spike = Dog("Spike",Toy()) 
>>> spike.play(3) 
Yip! Squeak! 
Yip! Squeak! 
Yip! Squeak! 
>>> 
+0

Je suis tellement reconnaissant pour votre solution. Eh bien, le plus difficile est que cet exercice nécessite que j'utilise un paramètre d'instance pour __init__, et deux pour la méthode play(). Alors, pouvez-vous penser à comment réparer play() en le faisant? Merci! – timy

+0

Hmmm n'a pas vu la balise 'Homework' au début ... ma mauvaise! La façon dont je l'ai codé maintenant est que le chien est un objet composite. Pour avoir un chien, vous devez d'abord avoir un jouet, ce qui n'est pas très réaliste. Mais pour le chien à jouer, un jouet ou un autre amusement pourrait être utile. Regardez ce que je vous ai donné, et pensez à quand le jouet devrait être donné au chien. Réfléchissez ensuite à la manière dont les différentes variables sont référencées et comment les références doivent être modifiées en fonction du moment où le jouet est transmis à l'objet Chien. Pouvez-vous dire que j'utilise pour enseigner la physique? Astuce: Vous avez seulement besoin de modifier quatre lignes de code. – snarkyname77