如何从类基础系统中获取区域列表

时间:2017-02-17 19:55:06

标签: python-3.x

所以我在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()

1 个答案:

答案 0 :(得分:0)

您可以使用cropcrops列表中添加sum(x.areaOfCrop for x in crops)个实例的区域。这是一个生成器表达式,它被传递给内置函数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经验才能擅长设计课程。)