2013-03-14 52 views
3

我對編程非常陌生,並且試圖自我教導。我目前正在嘗試學習如何從類構建對象,我認爲這是我理解的。我目前的任務是將該對象添加到列表中並打印該列表。最後,我想建立創建對象,並列出了已編號列表中被創建的每個對象,即程序:實例化Python對象並使用列表

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

所以就要開始了,我只是試圖建立的基本組成部分這個。 這裏是我做了什麼:

# 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!') 

當我運行它,我得到如下:

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! 

所以,從我可以告訴,一切正常,除了打印清單,我可以不知道。它似乎是追加列表propery,但不顯示對象。我也嘗試了'for'循環,但得到了相同的結果。

+0

蔬菜顧客RPG - 愛它! – Marcin 2013-11-14 18:55:54

回答

2

的問題是在線路

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

你在做什麼這裏正在創造一個新的素食,但不assinging什麼吧。然後,您將類型的Veg 附加到列表中。另外,您需要告訴Python如何通過將__str__方法添加到您的課程中,以可讀的方式將對象打印到Veg。最後,如果您直接打印列表(print vegList),您將獲得列表內容的機器可讀表示,這不是您想要的。迭代列表中的元素並直接打印它們將起作用。

這裏有必要改變工作版本:

# 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

它都按設計工作。 <class '__main__.Veg'>字符串是Veg類實例的表示

您可以通過給你的類__repr__ method定製表示:

class Veg: 
    # .... 

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

所有__repr__功能所要做的就是返回一個合適的字符串。

通過上面的例子__repr__功能,您的列表反而會看起來像:

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

你需要確保你真正追加新的實例。相反的:

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

做到這一點:

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

我將不得不研究這種方法來理解它。我在書中還沒有看到這一點。然而,當我插入時,我得到了和以前一樣的結果。 – Gregory6106 2013-03-14 14:52:32

+0

確保它是你的「素食」類的一部分。如果您仍然在結果中看到',那麼您沒有將它添加到正確的位置和/或沒有重新加載代碼。 – 2013-03-14 14:54:31

+1

他不應該爲類的人類可讀版本使用'__repr__'; '__str__'是爲此保留的。 '__repr__'保留給類的**機器可讀**版本。參見http://docs.python.org/3/reference/datamodel.html?highlight=__repr__#object.__repr__ – jknupp 2013-03-14 15:06:22

1

你的問題就在這裏:

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 

我的評論#1的行創建了一個蔬菜對象的新實例。但是,它沒有做任何事情。它不會將其存儲在任何地方,或者將其命名,就像您寫了a = Veg(name, color)一樣。基本上,它創建的對象,然後忘了它。

我評論爲#2的行然後將Veg CLASS附加到列表中,而不是類的實例。這就像將一個整數的概念提升到一個列表,而不是增加5

嘗試替換這兩行...的實際整數

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

一旦你這樣做,你」我仍然希望遵循Martijn Pieters的回答,讓對象正確打印。