Python 3.x 如何从基于类的系统中获取区域列表

Python 3.x 如何从基于类的系统中获取区域列表,python-3.x,Python 3.x,所以我在介绍python类,我们刚刚开始用python编写Bases类代码。我想从列表中的植物中得到一个面积列表,这样我就可以得到这些面积,得到一个总数,然后从床上的面积中减去它们。我很难弄清楚如何列出我床上的植物面积,目前只剩下蓝莓了。非常感谢您的任何想法 class crop: name = "Crop" sizeW = 0 sizeL = 0 areaOfCrop=sizeL * sizeW def print(self):

所以我在介绍python类,我们刚刚开始用python编写Bases类代码。我想从列表中的植物中得到一个面积列表,这样我就可以得到这些面积,得到一个总数,然后从床上的面积中减去它们。我很难弄清楚如何列出我床上的植物面积,目前只剩下蓝莓了。非常感谢您的任何想法

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()
类裁剪:
name=“作物”
sizeW=0
大小=0
作物面积=大小*大小
def打印(自):
打印(“这是一个”,self.name,“是”,self.sizeW,“X”,self.sizeL,“并且有一个”self.areaOfCrop“区域)
def willItFit(自身、W、L):

返回self.sizeW您可以将
crops
列表中
crops
实例的面积与
sum(x.areaofcropforx in crops)
相加。这是传递给内置函数
sum
的生成器表达式

但我认为你有一个更大的概念问题,这会在以后给你带来问题,即使你解决了眼前的问题。问题是您在代码中只使用类属性,而不是实例属性。虽然在某些情况下类属性是有用的,但绝大多数情况下您都希望处理实例属性

要创建实例属性,您需要在方法中进行赋值,并将其赋值给
self.attr
,而不仅仅是
attr
。通常初始化实例属性的地方是
\uuuu init\uuu
方法,Python在创建新实例后将为您调用该方法

举个例子,您的
crop
类可能应该以以下内容开头:

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

其中一些值可以作为参数传递,而不是总是设置为相同的常量。这就引出了一个设计问题:是否需要所有不同的工厂都是单独类的实例,或者它们都是一个类的不同实例,实例属性中包含不同的数据?(如果您还不知道答案,请不要太担心。要想擅长设计类,需要一些面向对象的经验。)

非常感谢您提供此技巧!我稍后再试试看是否有效。我不确定这是否有用。教授给了我们这段代码的大部分,并告诉我们自己想出这最后一部分。你所建议的是bettet方法,但他让我们这样做是为了学习基本知识。