Python 2.7 - 如何将一个Class属性(指针?)赋给变量(需要创建Oz-esque数据流变量)

时间:2016-02-13 04:41:14

标签: python class functional-programming dataflow oz

甚至可能吗?

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

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

3 个答案:

答案 0 :(得分:1)

对于点符号,您需要覆盖

def __setattr__(self, k, v):

def __getattr__(self, k):

答案 1 :(得分: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属性更好。

答案 2 :(得分: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
    
可以覆盖

来设置值。