2017-02-17 67 views
-1

因此,我介紹了python類,我們剛剛進入python類的basses編碼。我希望從列表中的植物中得到一個區域列表,以便我可以拿走這些區域,獲得一筆總額,然後從牀上的區域中扣除它們。我很難弄清楚如何製作我牀上植物區域的清單,這個清單現在只是藍莓。任何想法,不勝感激。如何獲得基於類的基礎系統的區域列表

class crop: 
    name = "Crop" 
    sizeW = 0 
    sizeL = 0 
    areaOfCrop=sizeL * sizeW 
    def print(self): 
     print("This is a ",self.name," and is ",self.sizeW,"X",self.sizeL, "and has an area of ",self.areaOfCrop) 
    def willItFit(self, W, L): 
     return self.sizeW <= W and self.sizeL <= L 
    def sameAs(self, crop): 
     return self.name == crop.name 

class plant(crop): 
    name = "Plant" 
    sizeW = 1 
    sizeL = 1 
    areaOfCrop = sizeL * sizeW 

class parsley(plant): 
    name = "Parsley" 

class shrub(crop): 
    name = "Shrub" 
    sizeW = 2 
    sizeL = 2 
    areaOfCrop = sizeL * sizeW 

class blueberries(shrub): 
    name = "Blueberries" 

class tree(crop): 
    name = "tree" 
    sizeW = 3 
    sizeL = 3 
    areaOfCrop = sizeL * sizeW 

class dwarfPeach(tree): 
    name = "Dwarf Peach" 

class bed: 
    sizeL = int(input("What is the length? ")) 
    sizeW = int(input("What is the width? ")) 
    crops = [blueberries()] # The list of crops in this bed 
    areaOfAllCrops = [crops[areaOfCrop()]] #this is where my problem is 
    def print(self): 
     print("The bed is ", self.sizeL," x ", self.sizeW) 
     for c in self.crops: 
      c.print() 
    def maxSizeAvailable(self): 
     ''' area of bed-total area of all crops in be ''' 
     return (self.sizeW, self.sizeL) 
    def add(self, newCrop):  
     dimension = self.maxSizeAvailable() 
     if newCrop.willItFit(dimension[0], dimension[1]): 
      self.crops.append(newCrop) 
    def remove(self, existingCrop): 
     for c in self.crops: 
      if c.sameAs(existingCrop): 
       self.crops.remove(c) 
    def checkFit(self, crop): 
     dimension = self.maxSizeAvailable() 
     return crop.willItFit(dimension[0], dimension[1]) 
b = bed() 
b.print() 

回答

0

您可以在crops列表與sum(x.areaOfCrop for x in crops)加起來crop實例的領域。這是傳遞給內建函數sum的生成器表達式。

但我認爲你有一個更大的概念問題,以後會導致你的問題,即使你立即解決問題。問題在於,你只能在代碼中使用類屬性,而不是實例屬性。儘管在某些情況下類屬性很有用,但絕大多數情況下,您希望處理實例屬性。

要創建實例屬性,您需要在方法中進行賦值,並將其指定給self.attr而不是僅指attr。通常,初始化實例屬性的地方是__init__方法,在創建新實例後,Python將爲您調用該方法。

舉個例子,你crop類或許應該這樣開始:

class crop: 
    def __init__(self): 
     self.name = "Crop" 
     self.sizeW = 0 
     self.sizeL = 0 
     self.areaOfCrop = sizeL * size 
    # ... 

其中一些值可以作爲參數傳遞,而不是總是越來越設置爲相同的常數。這導致我出現了一個設計問題:您是否需要將所有不同的工廠作爲單獨類的實例,或者它們都可以是一個類的不同實例,並且實例屬性屬性中具有不同的數據? (如果你還不知道答案,不要過於擔心,需要OOP的一些經驗來設計課程。)

+0

非常感謝你給這個提示!如果它有效。我不確定它是否有幫助。教授給了我們大部分的代碼,並告訴我們自己想出最後一部分。你所建議的是這樣的方式,但他讓我們這樣做來學習基礎知識。 –