动态变量始终链接到Python中的方法



我创建一个tkinter根:

root = tkinter.Tk()

并且想要创建一个动态变量,该变量将始终链接到root:的某个属性(或者它被称为方法?)

X = root.winfo_width()

如果rootwinfo_width()发生更改,我希望X自动更新。

如何做到这一点?它叫别名吗?一个动态变量?

如果你只想要一个简写,

X = root.winfo_width
print X()

问题是,尽管Python确实是动态的,但有一些事情总是做着完全相同的事情,这是无法改变的。

一个是简单的任务:

x = ...some complex expression...

这总是做同样的事情:它计算"某个复杂的表达式",然后x被更改,现在它是对表达式结果的引用。

另一种是变量评估:

x

简单地使用一个变量永远不会调用任何代码、方法或任何东西——在使用x的表达式中,x只是被它所指的任何东西"替换"

所以,做你想做的事情是不可能的,没有地方可以添加一些动态的东西。方法查找是一个明显的替代方案:

x.y

在这里,你可以实现x.getattr来返回你需要的东西(太棘手了),或者你可以给x一个属性方法y(就像其他答案一样)。

另一件事是,x可以引用一个可变的对象,而改变的可能是x的内容。例如,如果x指字典,

x = root.winfo_dimensions()
print x['width']

然后,您可以使root保留该字典本身的一个实例,并在宽度更改时更新它。也许它只保留一个并返回。但是,您也可以从其他地方更改内容,这很棘手。

我根本不会这么做,只在需要的地方调用root.winfo_width()。显式比隐式好。

根据您的具体需求,@property装饰器可能会起作用(基于@BrenBarn的答案):

class X(object):
    @property  # <-- this 'decorator' provides the necessary magic
    def x(self):
        return time.time()  # <-- just for example of refresh
    def __repr__(self):
        return str(self.x)

现在我们可以做:

>>> x = X()
>>> x
1386929249.63
>>> x
1386929250.27

但这可能是一个与解释器相关的技巧,但你仍然可以做到以下几点:

>>> x.x
1386929251.14
>>> x.x
1386929253.01

如果你有几个这样的"动态属性",你可以将它们分组在一个类中,并以这种方式访问它们(但就可读性而言,隐藏属性的动态行为可能不是一个好主意)。

我将告诉您如何创建函数的"别名",希望它能对您有所帮助。

def X():
    return root.winfo_width()

你做了这个定义,所以每次你调用"X()"时,你都会得到root.winfo_width()的值。如果root.winfo_wifth()值发生变化,你调用X(),你就会得到更新后的值

相关内容

  • 没有找到相关文章

最新更新