Python中的对象变量依赖项

时间:2013-12-25 13:53:01

标签: python oop

在Python中,创建对象A的对象变量的最佳方法是什么,它取决于对象B的变量,并在对象B的变量发生变化时自动更新?

简单示例:

class house:
    house_size = 100

class room:
    room_size = 30

house1 = house()
room1 = room()

house1.house_size = room1.room_size * 10
print house1.house_size #returns 300

room1.room_size = 50
print house1.house_size #still returns 300, but I would like it to return 500

在上面的示例中,定义了house1.house_sizeroom1.room_size之间的关系。但是,这仅解释一次。建立两个变量之间永久关系的最佳方法是什么,以确保house1.house_size随后room1.room_size发生变化时自动更新?{/ p>

修改 为了澄清,我正在寻找一个通用的解决方案,通过该解决方案,对象可以验证其所有依赖关系是否仍然是有效的"每当读取其对象变量的值时。在上面的示例中,对象变量house1.house_size取决于room1.room_size

您可以将这些依赖关系视为与电子表格应用程序类似:例如,单元格A1可能定义为=B1+B2+B3,而B1可能会定义为=C1*2 。每当正在读取单元格A1的值时,它将检查B1B2B3中是否有任何更改。如果是这样,那么在返回值之前将重新计算A1的值。所以在Python中我正在寻找一个事件处理程序,只要读取house1.house_size的值就会触发它,以便在返回之前重新计算它的值。

答案应该足够通用,以便可以处理对象的整个依赖树,从而树中的每个节点自行检查它所依赖的所有对象变量的所有值是否仍然有效,否则重新计算。

1 个答案:

答案 0 :(得分:2)

您必须在房间和房屋模型之间建立关系。在这个答案中,我使房间对象接受房屋对象作为参数之一,每当设置room_size参数时,它也会更新house_size

class house:
    house_size = 100

class room:
    def __init__(self, house_object):
        self.house_object = house_object
        self.room_size = self.house_object.house_size / 10

    def __setattr__(self, key, value):
        self.__dict__[key] = value
        if key == "room_size":
            self.house_object.house_size = self.room_size * 10

house1 = house()
room1 = room(house1)

room1.room_size = 50
print house1.house_size