是否可以在Python中实现全局计算属性?

问题描述 投票:3回答:2

在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]

这是出于与在类中看到计算属性的相同原因:作为属性的表示,而没有两次存储相同的信息。

python variables global
2个回答
2
投票

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


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)
© www.soinside.com 2019 - 2024. All rights reserved.