2016-02-13 11 views
2

Возможно ли это?Python 2.7 - Как присвоить переменную класса (указатель?) Переменной (нужно, чтобы создать переменные потока данных Oz-esque)

Идея состоит в том, что я хочу иметь специальную переменную, которая выполняет некоторую обработку при назначении или получении ее значений. Я также хочу, чтобы он выглядел как обычная переменная, поэтому точка-точка здесь является проблемой.

Я знаю, что это не совсем ясно, но это то, что мне нужно, чтобы попытаться воспроизвести Oz-esque Dataflow Variables.

Если что-то вроде этого стиля переменных потока данных уже реализовано в библиотеке python, сообщите мне.

Пример:

class Promise(object): 

    def __init__(self): 
     self._value = 'defalt_value' 

    @property 
    def value(self): 
     #some processing/logic here 
     return self._value 

    @value.setter 
    def value(self, value): 
     #some processing/logic here 
     self._value = value 

my_promise_obj = Promise() 
my_promise = my_promise_obj.value 

my_promise = 'Please, set my_promise_obj.value to this string' 

print ('Object`s Value:     ' + my_promise_obj.value) 
print ('My Variable`s value:    ' + my_promise) 
print ('Has I changed the class attr?: ' + str(my_promise == my_promise_obj)) 

ответ

0

Этот синтаксис не может работать в Python для этой цели:

my_promise = 'Please, set my_promise_obj.value to this string' 

причины является то, что она перераспределяет глобальное/локальное имя, чтобы указать струну; вы не можете перехватить это задание; и он даже не проконсультируется с объектом, на который указывает my_promise перед назначением.

Однако есть много на выбор; Наиболее очевидные из них Синтаксисы как

  • объект с set методом:

    my_promise.set('Please, set my_promise_obj.value to this string') 
    
  • метод, закрытие, или любой объект с __call__ методом:

    my_promise('Please, set my_promise_obj.value to this string') 
    
  • объект с Дескриптор данных:

    my_promise.value = 'Please, set my_promise_obj.value to this string' 
    

или что-то совершенно сумасшедший, как (только некоторые примеры множества возможностей):

  • объект с __iadd__:

    my_promise += 'Please, set my_promise_obj.value to this string' 
    
  • объект с __xor__:

    my_promise^'Please, set my_promise_obj.value to this string' 
    
  • объект с __rrshift__:

    'Please, set my_promise_obj.value to this string' >> my_promise 
    

может быть переопределен, чтобы установить значение.

1

для точечной нотации вам нужно переопределить

def __setattr__(self, k, v): 

и

def __getattr__(self, k): 
1

Если я правильно понимаю ваш вопрос, вы хотите, чтобы контролировать то, что происходит в переменной назначение и доступ? Как вы могли бы сделать на C++ с operator=?

В Python переменные всегда содержат ссылки на значения. Насколько я знаю, вы не можете перехватить это.

Однако, вы могли бы определить класс Var и перегружать некоторые другие операторы, например << и ~ и иметь такой код:

v = Var() 
w = ~v # wait for v to get a value and assign it to w 
v << 42 # single-assignment of a value to v 

Но я не уверен, что это будет лучше, чем value собственности как в вашем примере.

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

  • Нет связанных вопросов^_^