0

我一直在努力为以下应用程序在面向对象编程中找到一个好的模式。

假设您有一个需要修改的对象 - 也许,该对象是一栋房子,其房产价格将被修改/添加。此修改基于属性dimension_xdimension_y. 但是为了设定价格,我们需要比较其他类(在本例中为 Houses)中具有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

所以基本上我们的房屋类只是维度_x和维度_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

假设你的房子类有一个名为 GetDimensions 的函数,它返回一个 (dim_x,dim_y) 的元组,你可以轻松地构建一个矩阵来比较这些值。

使用管理器还可以让您不必直接处理每个单独的房屋类别,但您可以从管理器中抽象出流程。比如创建一个叫做 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排在第二位,那么它将在中间有一个值或其他什么。

于 2013-07-24T21:00:09.710 回答