甚至可能吗?
我的想法是,我想要一个特殊的变量,在分配或获取其值时进行一些处理。我也希望它看起来像一个常规变量,所以点符号在这里是一个问题。
我知道这不是很明确,但这是我尝试复制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 :(得分: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
来设置值。