所以我在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 :(得分:0)
您可以使用crop
在crops
列表中添加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经验才能擅长设计课程。)