Python 2.7 - 如何将类属性(指针?)分配给变量(需要它来创建 Oz-esque 数据流变量)

Posted

技术标签:

【中文标题】Python 2.7 - 如何将类属性(指针?)分配给变量(需要它来创建 Oz-esque 数据流变量)【英文标题】:Python 2.7 - How to assign a Class attribute (pointer?) to a variable (Need that to create Oz-esque Dataflow Variables) 【发布时间】:2016-05-24 09:40:14 【问题描述】:

有可能吗?

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

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

【问题讨论】:

【参考方案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

可以被覆盖以设置值。

【讨论】:

【参考方案2】:

对于点符号,您需要覆盖

def __setattr__(self, k, v):

def __getattr__(self, k):

【讨论】:

【参考方案3】:

如果我正确理解您的问题,您想控制变量分配和访问时发生的事情吗?就像在 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 属性更好。

【讨论】:

以上是关于Python 2.7 - 如何将类属性(指针?)分配给变量(需要它来创建 Oz-esque 数据流变量)的主要内容,如果未能解决你的问题,请参考以下文章

python 2.7 tix 清单文本属性

中源码100%真实有效-----如何将类初始化属性模块循环判断静态方法等一系列知识点结合起来做一个项目

您可以动态地将类属性/变量添加到python中的子类吗?

使用 Python 2.7 引发属性错误的多处理

如何将类属性设置为 Symfony2 表单输入

Xamarin 如何将类属性(来自另一个项目)绑定到 Picker.ItemDisplayBinding 属性