15. Traits基础

文章目录

Traits

Python作为一种动态编程语言,它的变量没有类型,这种灵活性给快速开发带来便利,不过也存在一定的缺点。

例如:颜色属性

  • ‘red’ 字符串
  • 0xff0000 整数
  • (255, 0, 0) 元组

但是’abc’不是合法的颜色值。

Traits库可以为Python添加类型定义。

Traits属性解决color类型问题

  • 接受能表示颜色的各种类型的值。
  • 赋值为不能表达颜色的值时,它能够立即捕捉到错误,提供一个错误报 告,告诉用户能够接受什么值。
  • 它提供一个内部、标准的颜色表达方式。

官方文档

Traits属性表示颜色

15. Traits基础

当输入c.color = 'abc'时:

15. Traits基础

输入c.configure_traits()。会弹出一个对话框。

15. Traits基础

点击红色部分可以选择颜色。

15. Traits基础

选择完成:

15. Traits基础

关闭窗口后返回True。

15. Traits基础

此时再次查看颜色,可以看到已经变为选择的颜色了。

15. Traits基础

Trait属性的功能

Trait库为Python对象的属性增加了类型定义功能。
还提供了功能:

  • 初始化:每个Trait属性都有自己的默认值。
  • 验证:Trait属性有明确的类型定义,满足定义的值才能赋值给属性。
  • 代理:Trait属性值可以代理给其他对象的属性。
  • 监听:Trait属性值发生变化时,运行事先指定的函数。
  • 可视化:拥有Trait属性的对象,可生成编辑Trait属性的界面。
from traits.api import Delegate, HasTraits, Instance, Int, Str
 
class Parent(HasTraits):
    # 初始化:last_name被初始化为'Zhang'
    last_name = Str('Zhang')
 
class Child(HasTraits):
    age = Int
    # 验证:father属性的值必须是Parent类的实例
    father = Instance(Parent)
    # 代理:Child实例的last_name属性代理给其father属性的last_name
    last_name = Delegate('father')
    # 监听:当age属性的值被修改时,下面的函数将被运行
    def _age_changed(self, old, new):
        print('Age change from %s to %s' % (old, new))

没有设置c.father属性,无法获得它的last_name属性:

15. Traits基础

设置father属性后,可以得到c的last_name属性:

15. Traits基础

c的age属性值发生变化时,将触发其监听函数_age_changed()

15. Traits基础

调用configure_traits()显示一个修改属性值的对话框:
由于father的属性是Parent类的对象,所以界面中以一个按钮来表示。

15. Traits基础

点击Father按钮,会弹出一个新的窗口:

15. Traits基础

这两个对话框中的last_name会同步改变。

print_traits()方法输出所有trait属性与其值。
get()方法获得描述对象所有trait属性的字典。
set()方法trait属性的值。

15. Traits基础

Trait属性监听

两种监听模式:

  • 静态监听
  • 动态监听

静态监听

静态监听函数
_age_changed(self)
_age_changed(self, new)
_age_changed(self, old, new)
_age_changed(self, name, old, new)

15. Traits基础

动态监听

动态监听函数
observer()
observer(new)
observer(obj, name, new)
observer(name, new)
observer(obj, name, old, new)

15. Traits基础

监听函数调用顺序

15. Traits基础

on_trait_change

    @on_trait_change('age')
    def print_info(self):
        print('age', 'has changed')

Event和Button属性

Event属性与其他Trait属性的区别:

\ Event属性 Trait属性
触发与其绑定的监听事件 当任何值对Event属性赋值时,不存储属性值,所赋值将会被忽略;如果试图获取属性值会产生异常。 只有在值发生改变时。
监听函数名 _event_fired() _trait_changed()

Button属性:

  • 具备Event事件处理功能
  • 通过TraitsUI库,自动生成界面中的按钮控件

15. Traits基础

Property属性

  • Property属性会建立与其他属性的依赖关系。(在这个例子里是w和h)
  • 有set和get方法(这个例子中只设置了get,所以area是只读的)。
  • @cached_property会将area的值放入缓存,只有在area的值需要变化时才会调用_get_property否则直接返回缓存中的值。

15. Traits基础

edit_traits无响应……网上也没有和我遇到相同情况的,只能用configure_traits了,这两个功能基本一样,edit_traits有的参数configure_traits全有。

这里找到了一段描述它们区别的文字。

7.2.1 外部视图和内外部视图

edit_traits()和configure_traits()一样,也被用于生成界面,它们的区别在于:edit_traits()显示界面之后不进入后台界面库的消息循环,因此如果直接运行只调用edit_traits()的程序,界面将在显示之后立即关闭,程序的运行也随之结束。而对于configure_traits(),将进入消息循环,直到用户关闭所有窗口。因此通常情况下,主界面窗口或模态对话框①使用configure_traits()显示,而无模态窗口或对话框则使用edit_traits()显示。

上一篇:痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU硬件那些事(2.2)- 在串行NOR Flash XIP调试原理


下一篇:AHB总线协议