【问题标题】:Setter doesn't fire when setting property inside init在 init 中设置属性时,Setter 不会触发
【发布时间】:2015-12-04 12:14:37
【问题描述】:

如何解决这个问题,以便在我初始化一个新的 TreeNode 并将其传递给属性节点时触发 'setter' 事件?

class TreeNode( QtGui.QTreeWidgetItem ):
    def __init__( self, parent, node ):
        super( TreeNode, self ).__init__( parent )
        self._node_object = node

    @property
    def node_object(self):
        return self._node_object

    @node_object.setter
    def node_object(self, value):
        self._node_object = value
        self.setText( 0, self._node_object.name )
        print "set data"

这不会触发 setter 事件。

node_object = Faction("Doug")
tree_node = TreeNode(self.node_tree, node_object)

但是这会触发事件......但理想情况下我想直接将节点传递给 TreeNode。

node_object = Faction("Doug")
tree_node = TreeNode(self.node_tree, None)
tree_node.node_object = node_object

更新

那么这是正确的设置方法吗?

class TreeNode( QtGui.QTreeWidgetItem ):
    def __init__( self, parent, node ):
        super( TreeNode, self ).__init__( parent )
        self.node_object = node

    @property
    def node_object(self):
        return self._node_object

    @node_object.setter
    def node_object(self, value):
        self._node_object = value
        self.setText( 0, self._node_object.name )
        print "set data"

【问题讨论】:

  • 更新后的代码看起来不错
  • 谢谢。我很感激。

标签: python


【解决方案1】:

好吧,您通过直接分配给基础属性来绕过设置器。如果你想调用 setter,分配给 setter

self.node_object = node

【讨论】:

  • 查看上面的更新部分,那是正确的设置方法吗?
  • 测试一下。它有效吗?好的。 (请注意,在具有旧式类的 Python 2 中,行为可能有所不同,这在问题中并不清楚。stackoverflow.com/questions/34025613/…
  • 如果QtGui.QTreeWidgetItem 不是新式类,您可以通过将object 添加到基类列表中来确保TreeNode 是。鉴于您显示的代码,应该可以在不引入任何其他问题的情况下工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多