2013-03-14 3 views
3

Je suis très novice en programmation et j'essaie de m'instruire. J'essaie actuellement d'apprendre à construire des objets à partir des classes, ce que je crois comprendre. Ma tâche actuelle consiste à ajouter l'objet dans une liste et à l'imprimer. En fin de compte, je suis en train de construire un programme qui crée un objet et énumère chaque objet qui a été créé dans une liste numérotée, à savoir:Instancier des objets Python et utiliser des listes

1 - tomato, red 
2 - corn, yellow 
etc... 

Donc, pour commencer, je vais juste essayer de construire la partie de base ce. Voici ce que je fait:

# Builds objects on instantiation for a vegetable and color 
class Veg: 
    def __init__(self, name, color): 
     self.name = name 
     self.color = color 
     print('You have created a new', self.color, self.name, end='.\n') 

# Function to create a new vegetable and store it in a list 
def createVeg(): 
    name = input('What is the name of the Vegetable? ') 
    color = input('What color is the vegetable? ') 
    Veg(name, color) 
    vegList.append(Veg) 
    return 

# Initialize variables 
vegList = [] 
choice = 'y' 

# Main loop 
while choice == 'y': 
    print('Your basket contains:\n', vegList) 
    choice = input('Would you like to add a new vegetable? (y/n) ') 
    if choice == 'y': 
     createVeg() 
    if choice == 'n': 
     break 

print('Goodbye!') 

Quand je cours, je reçois le texte suivant:

Your basket contains: 
[] 
Would you like to add a new vegetable? (y/n) y 
What is the name of the Vegetable? tomato 
What color is the vegetable? red 
You have created a new red tomato. 
Your basket contains: 
[<class '__main__.Veg'>] 
Would you like to add a new vegetable? (y/n) y 
What is the name of the Vegetable? corn 
What color is the vegetable? yellow 
You have created a new yellow corn. 
Your basket contains: 
[<class '__main__.Veg'>, <class '__main__.Veg'>] 
Would you like to add a new vegetable? (y/n) n 
Goodbye! 

Alors, de ce que je peux dire, tout fonctionne sauf pour l'impression de la liste, je peux pas comprendre. Il semble que l'ajout de la liste soit ajouté, mais pas l'affichage de l'objet. J'ai aussi essayé une boucle 'for', mais j'ai obtenu le même résultat.

+0

shopper légumes RPG - love it! – Marcin

Répondre

2

Le problème est dans les lignes

Veg(name, color) 
vegList.append(Veg) 

Ce que vous faites ici est de créer une nouvelle Veg mais pas assinging quoi que ce soit. Ensuite, vous ajoutez Veg le type à une liste. En outre, vous devez indiquer à Python comment vous imprimer les objets Veg d'une manière lisible par l'homme en ajoutant la méthode __str__ à votre classe. Enfin, si vous imprimez une liste directement (print vegList) vous obtiendrez la représentation lisible par l'ordinateur du contenu de la liste, ce qui n'est pas ce que vous voulez. Itérer sur les éléments de la liste et les imprimer directement fonctionnera.

est ici une version de travail avec les changements nécessaires:

# Builds objects on instantiation for a vegetable and color 
class Veg: 
    def __init__(self, name, color): 
     self.name = name 
     self.color = color 
     print('You have created a new', self.color, self.name, end='.\n') 

    def __str__(self): 
     return 'One {} {}'.format(self.color, self.name) 

# Function to create a new vegetable and store it in a list 
def createVeg(): 
    name = input('What is the name of the Vegetable? ') 
    color = input('What color is the vegetable? ') 

    vegList.append(Veg(name, color)) 
    return 

# Initialize variables 
vegList = [] 
choice = 'y' 

# Main loop 
while choice == 'y': 
    print('Your basket contains:\n') 
    for veg in vegList: 
     print(veg) 
    choice = input('Would you like to add a new vegetable? (y/n) ') 
    if choice == 'y': 
     createVeg() 
    if choice == 'n': 
     break 

print('Goodbye!') 
6

Tout fonctionne comme prévu. La chaîne <class '__main__.Veg'> est la représentation de vos instances de classe Veg.

Vous pouvez personnaliser cette représentation en donnant votre classe un __repr__ method:

class Veg: 
    # .... 

    def __repr__(self): 
     return 'Veg({!r}, {!r})'.format(self.name, self.color) 

Toutes les fonctions __repr__ doit faire est de retourner une chaîne appropriée.

Avec la fonction exemple __repr__ ci-dessus, votre liste serait plutôt ressembler à:

[Veg('tomato', 'red'), Veg('corn', 'yellow')] 

Vous ne devez vous assurer que vous avez réellement votre nouvelle ajoutez par exemple. Au lieu de:

Veg(name, color) 
vegList.append(Veg) 

faire:

newveg = Veg(name, color) 
vegList.append(newveg) 
+0

Je vais devoir chercher cette méthode pour la comprendre. Je n'ai pas encore vu cela dans le livre. Cependant, quand je le branche, j'obtiens le même résultat qu'avant. – Gregory6106

+0

Assurez-vous que cela fait partie de votre classe 'Veg'. Si vous voyez toujours '' dans vos résultats, vous ne l'avez pas ajouté à l'emplacement correct et/ou n'avez pas rechargé votre code. –

+1

Il ne devrait pas utiliser '__repr__' pour la version lisible par l'homme de la classe; '__str__' est réservé pour cela. '__repr__' est réservé à la version ** lisible par machine ** de la classe. Voir http://docs.python.org/3/reference/datamodel.html?highlight=__repr__#object.__repr__ – jknupp

1

Votre question est ici:

def createVeg(): 
    name = input('What is the name of the Vegetable? ') 
    color = input('What color is the vegetable? ') 
    Veg(name, color) # 1 
    vegList.append(Veg) # 2 
    return 

La ligne que j'ai commenta # 1 crée une nouvelle instance d'un objet veg. Cependant, ça ne fait rien avec ça. Il ne le stocke pas n'importe où, ou ne le nomme pas, comme si vous aviez écrit a = Veg(name, color). Fondamentalement, il crée l'objet, puis l'oublie.

La ligne que j'ai commentée comme # 2 ajoute ensuite la classe Veg CLASS à la liste, plutôt qu'une instance de la classe. Ce serait comme ajouter le concept d'un entier à une liste, plutôt que d'ajouter un nombre entier réel de 5.

Essayez de remplacer ces deux lignes avec ...

v = Veg(name, color) 
vegList.append(v) 

Une fois que vous faites cela, vous Je vais toujours vouloir suivre la réponse de Martijn Pieters pour que l'objet imprime correctement.

Questions connexes