【问题标题】:Property for changing an object-attribute in an object用于更改对象中的对象属性的属性
【发布时间】:2019-01-19 21:10:06
【问题描述】:

当对象中的对象的属性发生更改时,我需要调用方法。所以我选择了属性,但没有成功。

我使用属性来检查对象中的对象是否正在发生变化。但这只会在我分配该类型的新对象或现有对象时调用 setter,而不是在我更改其中的属性时调用。

class Position:
    def __init__(self):
        self.x = 0
        self.y = 0

class Player:
    def __init__(self, x, y):
        self.__position = Position()
        self.__position.x = x
        self.__position.y = y

    @property
    def position(self):
        return self.__position

    @position.setter
    def position(self, value):
        print('Position changed')
        self.__position = value

player = Player(5, 10)
player.position = Position() # Setter gets called
player.position.x = 10 # Setter doesn't get called

目前,该示例在player.position = Position() 行中打印一次“位置已更改”。但是当 X 或 Y 改变时,我需要调用 setter。

提前致谢!

【问题讨论】:

  • 当您执行 player.position.x 时,您并没有设置 player.position,您只是在更改位置对象中的值。 player.position 仍然是原来的 Position 实例。 player.position = Position(10,10) 可能会按预期工作。
  • @MatthewPage 并且无法检查 X 或 Y 是否已更改?没有分配新职位?
  • 抱歉,Python 还没有那么远,但理论上是的。如果 Player 扩展了 Position 类,Position 类是否会知道它的父级,我再次不确定 Python OO。 Position 类需要说“告诉我是什么创造了我我已经改变了”,通常是通过调用父级中的 message 方法..?

标签: python class properties


【解决方案1】:

问题:当 X 或 Y 发生变化时,我需要调用 setter。

如果您想了解情况,如果xy 发生变化,请使用x.settery.setter

例如:

@x.setter
def x(self, value):
    print('Position X changed')
    self.__position.x = value

用法

player.x = 10

【讨论】:

    猜你喜欢
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多