有没有一种方法可以在Python中实现全局计算属性?

时间:2020-01-05 11:40:51

标签: python variables global

在Swift中,我们可以在任何范围内(包括在另一个函数内部)执行以下操作:

var X:Int = 3
var twiceX:Int{
    return 2*X
}
print(twiceX) //6

这意味着我们可以在不使用“()”语法的情况下调用getter函数。任何不带参数并返回一个值的函数也可以实现为计算机属性。此外,还可以提供设置器功能。

我看到可以使用@property声明符来使属于类的计算属性成为可能,但我看不出有什么方法可以使它成为全局属性。我希望在类范围内一切可能,在全局范围内一切可能。

Python中是否有全局计算属性?

备注:我知道它主要是合成糖,每次通话都消除一对“()”。但是,在某些情况下,属性比函数更直观。一个例子是:

queue = [1,4,7]
def current():
    return queue[0]

使用此命令的原因与在类中看到计算属性的原因相同:作为属性的表示形式,无需两次存储相同的信息。

2 个答案:

答案 0 :(得分:2)

不。变量查找和属性查找是Python中完全独立的机制。一个可能发生的事情在另一个可能发生的事情中不一定是可能的,在这种情况下,变量没有property的等效项。

答案 1 :(得分:1)

如果您的用法仅仅是在命令行中写出您的属性,但是您总会得到一个字符串(并且您还可以进行任何评估),这是一种黑客方法。在运行交互式shell时,有时会用它来制作漂亮的命令行语法糖。这是要覆盖包装类的__repr__方法(问题中,您的属性创建者):

queue = [1, 2, 3, 4, 5]


class currentQueueProp:
    def __init__(self, transform=lambda x: x):
        self.transform = transform

    def __repr__(self, transform = lambda x: x):
        return str(self.transform(queue[0]))


current = currentQueueProp()
twice_current = currentQueueProp(lambda x: 2*x)

queue[0] = 3

print(current, twice_current) # What you expect

请注意,currenttwice_current是您的类,而不是队列的当前值。因为

>>> x = twice_current
>>> x

似乎显示3(从上一个示例继续),但是当然x的类型为currentQueueProp,并且您不能对其进行算术运算,等等:

f(x) # Not equivalent to f(3)