2016-09-04 55 views
0

我正在研究一個涉及創建和使用一個類與幾種方法的python assingment。我不會發布整件事情,因爲如果我展示一個我想要做的事情的例子,指出我的問題會更簡單。問題以外的python類調用方法

class Fruit(self,color,name): 
    def __init__(self, color, name): 
     self.color = color 
     self.name = name 

    def return_list(self, index): 
     print fruit_list[index] 

fruit_list = [] 

fruit_1 = Fruit("red", "apple") 
fruit_list.append(fruit_1.color) 
fruit_list.append(fruit_1.name) 

所以上面的代碼工作。我的問題是如何return_list工作的類以外使用時,像這樣:

fruit_choice = int(raw_input("What fruit would you like?")) 
Fruit.return_list(fruit_choice) 

基本上我試圖創建一個名爲方法時,輸出列表中的索引處的項目,該指數爲由用戶輸入指定(即fruit_choice = 0,打印項目是列表的第一個元素)。

我對類有基本的瞭解,但得到一個有點模糊的方法來像return_list一樣工作有點不直觀。該錯誤消息我得到:

Fruit.return_list(fruit_choice) 
TypeError: unbound method return_list() must be called with Fruit instance as first argument (got int instance instead) 

我知道,如果我得到的代碼工作的輸出將是「紅」,如果輸入爲0,而不是「紅,」蘋果」,但是這是一個問題,另一個時間。

如果有人能指出我什麼我做錯了創建/調用return_list方法,請和感謝。

+0

'Fruit.return_list(fruit_choice)'應該是'fruit_1.return_list(fruit_choice)'。你必須將該方法附加到一個實例(這就是消息所說的)。但之後,它不會工作,因爲'fruit_list'不是該類的成員(並且它不應該是因爲你不需要水果對象中的水果列表!)。學習OO編程更多... –

回答

0

你似乎有類和類實例的誤解。

您定義的return_list函數是Fruit類的一部分,即Fruit類的每個實例都包含此方法。但是使用這個函數返回水果列表中的特定水果,這個函數獨立於個體Fruit實例,這意味着該方法不應該在Fruit類中首先出現。

類定義class Fruit(self,color,name)的簽名是錯誤的。它應該是class Fruit:。初始參數應定義爲__init__方法的參數。

列表fruit_list應該包含Fruit實例。該程序可寫爲:

class Fruit: 
    def __init__(self, color, name): 
     self.color = color 
     self.name = name 

    def __str__(self): 
     return 'I am a ' + self.color + ' ' + self.name 

fruit_list = [] 

fruit_1 = Fruit("red", "apple") 
fruit_list.append(fruit_1) 

fruit_choice = int(raw_input("What fruit would you like?")) 
print(fruit_list[fruit_choice]) 

打印一個Python對象調用__str__魔術方法。

如果你真的想有一個單獨的功能,將來自fruit_list返回Fruit,您可以定義在類外的函數(但這些似乎沒有必要的時候可以使用索引直接訪問實例):

def return_list(list, index): 
    return list[index] 

def return_list(index): 
    global fruit_list 
    return fruit_list[index] 

如果您嘗試打印使用print(fruit_list)輸出整個列表是:

[<__main__.Fruit instance at 0x110091cf8>] 

這是因爲在打印實例列表時,Python不會在每個實例上調用__str__。您可以通過執行打印fruit_list

for fruit in fruit_list: 
    print(fruit) 
+0

謝謝,這可以幫助我很多。如果我想顯示整個列表,我該怎麼做?只是把[:]作爲索引或者根本沒有[]似乎並不奏效(指代你的第一塊代碼) – Cyanidies

+0

@Cyanidies你可以檢查編輯。謝謝 – Ananth

1

基本上你是叫沒有一個實例,這就是爲什麼你得到這個實例方法錯誤

TypeError: unbound method return_list() must be called with Fruit instance as first argument (got int instance instead) 

改正的代碼

fruit_1.return_list(fruit_choice) 

你正在做的方式是靜態方法的行爲,他們被稱爲沒有一個實例。 請通過python中的實例方法和靜態方法進行一些oops編程。

希望它能幫助:)

0

這裏是一個可能的解決問題的方法:

class Fruit(): 

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

    def __str__(self): 
     return "Color: {0} Name: {1}".format(self.color, self.name) 


class FruitBasket(): 

    def __init__(self): 
     self.fruits = [] 

    def get_fruit(self, index): 
     try: 
      value = self.fruits[index] 
      return value 
     except Exception as e: 
      print "Error with index {0} -> {1}".format(index, e) 

if __name__ == "__main__": 
    basket = FruitBasket() 
    names = ["apple", "orange", "lemon"] 
    colors = ["green", "orange", "yellow"] 

    for name, color in zip(names, colors): 
     fruit = Fruit(color, name) 
     basket.fruits.append(fruit) 

    print basket.get_fruit(0) 
    print basket.get_fruit(1) 
    print basket.get_fruit(2) 
    basket.get_fruit(3) 

關於上述代碼幾點意見:

  • 水果對象沒有更多比設定一個名稱爲&顏色的水果的責任感,這是非常多的。一個水果不應該包含任何水果列表,這應該是另一個對象的責任
  • FruitBasket是水果的容器,你可以做到完美,而不使用OOP,但爲了這個問題,這是一個有效的選擇持有很多水果

關於你的錯誤,其他答案和評論已經指出了什麼是錯的。另外,大約class Fruit(self,color,name):,不要這樣做,在這句話中,你聲明的是類的類型,而不是構造函數。

我強烈建議你試着去關注一下OOP python tutorials