2

甚至可能吗?

这个想法是我想要一个特殊的变量,在分配或获取它的值时进行一些处理。我还希望它看起来像一个常规变量,所以点符号在这里是个问题。

我知道这不是很明确,但这就是我尝试复制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))
4

3 回答 3

1

对于点符号,您需要覆盖

def __setattr__(self, k, v):

def __getattr__(self, k):
于 2016-02-13T04:44:26.613 回答
1

如果我正确理解您的问题,您想控制变量分配和访问时会发生什么?就像你可以在 C++ 中使用operator=?

在 Python 中,变量总是包含对值的引用。据我所知,你不能拦截这个。

但是,您可以定义一个类Var并重载一些其他运算符,例如<<and~并具有如下代码:

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你的例子中的财产更好。

于 2016-02-13T09:30:41.800 回答
1

此语法在 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
    

可以覆盖以设置值。

于 2016-02-13T09:43:37.803 回答