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

Это вообще возможно?

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

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

Если что-то подобное этому стилю переменных потока данных уже было реализовано в библиотеке 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))

person Pedro -Coin- Duarte    schedule 13.02.2016    source источник


Ответы (3)


Этот синтаксис не может работать в 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
    

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

person Antti Haapala    schedule 13.02.2016

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

def __setattr__(self, k, v):

а также

def __getattr__(self, k):
person Grady Player    schedule 13.02.2016

Если я правильно понимаю ваш вопрос, вы хотите контролировать, что происходит при присвоении переменных и доступе к ним? Как вы могли бы сделать в 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, как в вашем примере.

person wmeyer    schedule 13.02.2016