0

次のアプリケーションのオブジェクト指向プログラミングで適切なパターンを見つけるのに苦労しています。

変更が必要なオブジェクトがあるとします。オブジェクトが家で、そのプロパティの価格が変更/追加される可能性があります。dimension_xこの変更は、プロパティおよびに基づいていますdimension_y。しかし、価格を設定するには、 と を持つ他のクラス (この場合はハウス) のインスタンスを比較する必要がdimension_xありdimension_yます。

class Houses(object):
  def __init__(self, dimension_x=None, dimension_y=None):
    self.dimension_x = dimension_x
    self.dimension_y = dimension_y

class City(object):
  def __init__(self, houses_without_price=None):
    self.houses_without_price = houses_without_price
    self.houses = []
  def set_dimensions(self, house1_without_price, house2_with_price):
      # calculate dimension_x, dimension_y and set these properties 
      # in an instance of Houses
  def set_price(self, house1):
     # based on dimension_x and dimension_y from our instance of Houses, 
     # add a price to the instances of self.houses_without_price

したがって、基本的にクラス Houses は、dimension_x と dimension_y の単なるストレージです。明らかに、代わりに辞書を使用できます。ただし、houses_without_price とディクショナリの間の相互作用は複雑になりがちです。例えば:

d = [{'object': house_without_price_1, 'dimension_x': 20, 'dimension_y': 34}, 
{'object': house_without_price_2, 'dimension_x': 43, 'dimension_y': 55}...]

次に、価格プロパティを計算します。

この種のオブジェクト間の相互作用に対処する最善の方法は何ですか?

4

2 に答える 2

2

マネージャー クラスを作成します。

すべてのハウスクラスを含む何か、リストとしましょう。

次に、次のような関数をマネージャー クラスに含めることができます。

def CompareDimensions(self):
    dims = [list(instance.GetDimensions()) for instance in self.house_list]
    dims = numpy.array(dims)
    # .... futher processing on matrix

ハウス クラスに (dim_x,dim_y) のタプルを返す GetDimensions という関数があると仮定すると、これらの値を比較するマトリックスを簡単に作成できます。

マネージャーを使用すると、個々のハウス クラスを直接処理する必要がなくなりますが、マネージャーからプロセスを抽象化できます。PushNewHouse(self,dim_x,dim_y) というマネージャー関数を作成するなど

より詳細な説明:

import numpy # Assuming you have numpy available

class Houses(object):
    def __init__(self, dimension_x=None, dimension_y=None):
        self.dimension_x = dimension_x
        self.dimension_y = dimension_y
    def GetDimensions(self):
        return (self.dimension_x,self.dimension_y)

class HouseManager(object):
    def __init__(self):
        self.house_list = []
    def PushNewHouse(self,dim_x,dim_y):
        self.house_list.append(House(dim_x,dim_y))
    def CompareDimensions(self):
        dims = [list(instance.GetDimensions()) for instance in self.house_list]
        dims = numpy.array(dims)
        # .... futher processing on matrix
于 2013-07-24T21:03:52.833 に答える
0

Python はわかりませんが、C# では次のようになります。

public class House(){
    public double X { get; set; }
    public double Y { get; set; }
    public double Area(){
       return X*Y;
    }
    public double Value { get; set; }
}

Python で辞書を定義する方法がわかりませんが、基本的に C# のような疑似コードでは、

Dictionary<double, List<House>> HousesWithValue = new Dictionary<int, List<House>>(); 

プロセスに関する私の最初の理解は、ディクショナリに追加される既知の値を持つ家のコレクション全体が得られるというものでした。あなたは価値のない新しい家を持っています。なので、都市に追加するときは、まず地域別の辞書を調べて、そのリストから住宅価格から平均価格を求めます。

しかし、どの家にも価格がない場合、基本的に探しているのは、価値のあるプロパティを持つ家を並べ替える方法です。

// これが正しい python でない場合は申し訳ありません。私はそれに慣れていません。

house_tuples = [
    ('house1', 20, 30, 600),
    ('house2', 30, 40, 1200),
    ('house3', 30, 30, 900),
]
>>> sorted(house_tuples, key=lambda house: house[3])   # sort by area or something

次に、エリアなどに基づいてリストを並べ替えることができます。これにより、絶対値の知識がなくても、「相対」価格を把握できます。したがって、並べ替え後に house3 が 2 番目であることが判明した場合、その値は真ん中か何かになります。

于 2013-07-24T21:00:09.710 に答える