• 科学计算三维可视化---Traits属性的功能


    Traits属性的功能

    Traits库为python的属性增加了类型定义的功能,除此之外他还提供了5个特殊的功能(可以为用户的界面响应提供基本能力):
    初始化:每个traits属性都有自己的默认值

    验证:是traits属性有明确的类型定义,只有满足定义的值时才能给他赋值

    代理:traits属性值可以代理给其他对象实例的属性


    监听:是为了当traits属性发生变化时,可以运行事先指定的函数


    可视化:是拥有traits属性的对象,可以方便的生成可以编辑traits属性的界面

    使用

    from traits.api import HasTraits,Delegate,Instance,Int,Str
    
    class Parent(HasTraits):
        #初始化
        last_name = Str("Zhang")  #初始化
    
    class Child(HasTraits):
        age = Int
        #验证
        father = Instance(Parent)   #定义了father属性是Parent的实例,而此时father的默认属性是None
        #代理
        last_name = Delegate('father')  #通过Delagate为child对象创建了代理属性last_name,代理功能将使得c.last_name和c.father.last_name始终保持相同的值
        #监听
        def _age_changed(self,old,new):
            print("Age change from %s to %s"%(old,new))
    >>> p = Parent()  #实例化对象
    >>> c = Child()

    代理

    (由Delegate生成的属性,其必须是由父类实例代理而来的,两者保持一致性<当子类没有主动修改值时,会一直随着父类实例属性变化,当子类修改属性后,就不会再随着改变>,不过前提是已经声明了父类实例)

    >>> c.last_name
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'NoneType' object has no attribute 'last_name'  #说明没有设置c.father属性,无法获得last_name属性
    >>>  

    正确使用

    >>> c.father = p
    >>> c.last_name
    'Zhang'
    >>> p.last_name
    'Zhang'
    >>> p.last_name = "li"
    >>> p.last_name
    'li'
    >>> c.last_name        #子类没有修改自己属性前,会一直随着父类变化
    'li'
    >>> c.last_name = "wang"  #子类修改了自己的属性后,不会再随着父类改变而变动了
    >>> p.last_name
    'li'
    >>> p.last_name = "li"
    >>> c.last_name
    'wang'
    >>> p.last_name = "li1"
    >>> c.last_name
    'wang'

     验证(使用时在代理前面,这里放在后面方便理解):

    上面代理父类的属性时,我们必须先将父类实例赋值给我们的验证属性
    #验证
    father = Instance(Parent)   #定义了father属性是Parent的实例,而此时father的默认属性是None
    上面只是说明father属性必须是Parent的实例,类型验证必须一致,但是我们还没有进行赋值
    >>> c.father = p  #在赋值基础上进行了验证,成功后father属性不为None,代理也开始生效
    >>> c.last_name
    'Zhang'

    监听(监听函数与属性之间的关系 "  _属性名_changed "  不需要属性,只声明监听方法就会含有该属性):

    #监听
    def _age_changed(self,old,new):
       print("Age change from %s to %s"%(old,new))
    >>> c.age = 4
    Age change from 0 to 4

    可视化(使用configure_traits来显示一个修改属性的对话框):

    >>> c.configure_traits()

    >>> c.print_traits()  #输出所有的traits属性
    age:       4
    father:    <__main__.Parent object at 0x000000000EADA3B8>
    last_name: 'wang'
    >>> c.get()  #获取字典类型的traits属性
    {'last_name': 'wang', 'father': <__main__.Parent object at 0x000000000EADA3B8>,
    'age': 4}
    >>> c.set(age = 8)  #使用set设置值
    Age change from 4 to 8
    <__main__.Child object at 0x000000000EADA4C0>

    注意:

    我们若是在子类中使用了__init__方法,那么在其中必须调用父类的__init__方法,否则traits属性的一些功能将无法使用

    C++ traits技术浅谈

  • 相关阅读:
    MySQL存储引擎--MyISAM与InnoDB区别
    PHP笔试面试题精选(一)
    优化 sql 语句的一般步骤
    EXPLAIN 小秘密
    Git stash 使用的小技巧
    git remote用法
    git subtree用法
    nodejs-------windows安装配置
    MongoDB -----windows上安装服务
    layer父子页面交互
  • 原文地址:https://www.cnblogs.com/ssyfj/p/9308441.html
Copyright © 2020-2023  润新知