2017-02-17 7 views
-1

私はPythonクラスの紹介に入り、クラスベースのコードをPythonでコーディングしています。私は私のリストの植物からエリアのリストを取得することを望んでいるので、私はそれらのエリアを取ることができます、合計を取得し、ベッドの領域からそれらを引きます。私はベッドの中の植物のエリアのリストを作る方法を考え出すのに苦労しています。これは今のところブルーベリーだけです。どんなアイデアも大歓迎です。クラスベースのシステムから領域のリストを取得するには

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

あなたはsum(x.areaOfCrop for x in crops)cropsリストにcropインスタンスの領域を追加することができます。これは組み込み関数sumに渡されるジェネレータ式です。

しかし、あなたはすぐに問題が二乗されても後で問題を引き起こす大きな概念上の問題があると思います。問題は、インスタンス属性ではなく、コード内でクラス属性を排他的に使用していることです。クラス属性が有用な状況がいくつかありますが、代わりにインスタンス属性を扱うことが圧倒的に多い場合があります。

インスタンス属性を作成するには、メソッド内で代入を行い、attrではなくself.attrに割り当てる必要があります。通常、インスタンスの属性を初期化する場所は、__init__のメソッドです。これは、Pythonが新しいインスタンスを作成した後に呼び出す方法です。例を与えることを

、あなたのcropクラスは、おそらくで始める必要があります。

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

これらの値のいくつかは、引数として渡すことができ、ではなく、常に同じ定数に設定して得ます。つまり、異なるプラントを別々のクラスのインスタンスにする必要があるのですか、それともそれらはすべてインスタンス属性の属性に異なるデータを持つ1つのクラスの異なるインスタンスになる可能性がありますか? (まだ答えがわからない場合は、あまり心配しないでください。クラスをデザインする上で、OOPの経験が必要です)

+0

このヒントをいただきありがとうございます!それが動作すれば。それが助けになるかどうかわからない。教授はこのコードの大部分を私たちに与え、私たちにこの最後の部分を私たち自身で考え出すように言った。あなたが提案しているのはベットーの方法ですが、彼は基本を学ぶためにこれをやっています。 –

関連する問題