PyGTK 属性与 Python 属性
在使用PyGTK从GObject类派生时,你可以像在C语言中那样定义GObject属性,方法是使用一个叫做__gproperties__
的字典,以及do_get_property
和do_set_property
这两个方法。具体的内容可以参考这里的在Python中子类化GObject。需要注意的是,这段内容是在Python有@property
装饰器之前写的。
GObject属性的一个好处是,你可以连接到对象的notify::property-name
信号,这样每当属性发生变化时,你就会收到通知。除此之外,还有什么好的理由让我们使用GObject属性,而不是Python的@property
装饰器呢?
2 个回答
除了这个,还有什么好理由让我们用GObject的属性,而不是Python的@property装饰器吗?
其实没有什么特别的理由。使用GObject属性需要写很多重复的代码,所以除非我需要用到notify
信号,我通常会直接在Python里写我需要的东西。
不过,我常常会想“这个属性我不需要通知”,然后突然意识到“其实,我根本不需要这个属性。”
为什么不使用它们呢?通过Python的绑定提供的简化版本,定义GObject属性和定义Python属性其实没什么太大区别。
不过,除了通知功能,还有一些其他的好处。我过去用过的一个好处是可以在gtk.Builder文件中设置属性。例如,在你的用户界面文件中,
<object class="GtkImage" id="image">
<property name="stock">gtk-missing-image</property>
</object>
当Builder类构建Image对象时,它会设置stock
属性;如果你在自定义小部件中使用GObject属性,你也可以利用这一点。随着Glade中对属性绑定支持的出现,这种行为会变得更加有用。
另一个潜在的好处是GObject属性可以设置整数和浮点数的最小值和最大值,以及默认值,这在与用户界面相关的属性中有时会很有用。