2015-02-09 4 views
2

У меня возникли проблемы с попыткой динамически инициализировать черты Диапазон объект.Динамическая инициализация объектов Область Объект

Следующий код является очень простым примером того, что я пытаюсь сделать, но, к сожалению, не может со следующей ошибкой типа:

TypeError: unsupported operand type(s) for -: 'int' and 'code'

from traits.api import HasTraits, Int, Range 
from traitsui.api import View, Item 

class DynamicRange(HasTraits): 
    """Dynamic initialisation of a Range object""" 
    N = Int() 
    R = Range(low=0, high='N') 

    traits_view = View(Item('R'), Item('N')) 

    def __init__(self, N): 
     self.N = N   # initial parameter value for N 

    def _N_default(self): 
     return self.N 

Robject = DynamicRange(N=10) 
Robject.configure_traits() 

код работает, если я заменю определение " R 'с: R = Range (low = 0, high = 10), но тогда, конечно, я не получаю динамическую инициализацию высокого параметра Range, который я ищу.

Все предложения с благодарностью приняты.

* Редактирование после ответа Джонатана *

Вот простое решение на мой вопрос, используя полезный совет Джонатана ниже:

from traits.api import HasTraits, Range 
from traitsui.api import View, Item 

class DynamicRange(HasTraits): 
    """Dynamic initialisation of a Range object""" 
    traits_view = View(Item('R')) 

    def __init__(self, N): 
     self.add_trait("R", Range(0, N)) 

Robject = DynamicRange(N=30) 
Robject.configure_traits() 

ответ

3

Вы испытываете черты/TraitsUI ошибка:

обходным является создание еще Черту для нижнего конца:

from traits.api import HasTraits, Int, Range 
from traitsui.api import View, Item 


class DynamicRange(HasTraits): 
    """Dynamic initialisation of a Range object""" 

    # Upper limit of R 
    N = Int() 

    # Lower limit of R (not exposed to the user) 
    _zero = Int(value=0) 

    R = Range(low='_zero', high='N') 

    traits_view = View(Item('R'), Item('N')) 


Robject = DynamicRange(N=10) 
Robject.configure_traits() 

Или используйте решение @ JonathanMarch. :)

+0

Спасибо за объяснение сути этой проблемы, Уоррен. Если вы хотите, чтобы диапазон был действительно динамическим (не только при инициализации), это гораздо лучшее решение, как иллюстрирует пример кода Уоррена. –

+0

Да, спасибо Уоррену, это действительно лучшее решение, поскольку оно позволяет обновлять код класса. Я не понял, что объекты признаков, объявленные в начале кода класса, могут быть инициализированы с переданными параметрами при создании объекта. – dreme

+0

Ах, но я вижу, что прохождение параметров таким образом работает только в том случае, если у вас нет функции __init__ в вашем коде класса. – dreme

Смежные вопросы