【问题标题】:Dynamic variable always linked to a method in Python动态变量始终链接到 Python 中的方法
【发布时间】:2013-12-13 08:55:42
【问题描述】:

我创建了一个 tkinter 根目录:

root = tkinter.Tk()

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

X = root.winfo_width()

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

如何做到这一点? 它被称为别名吗?动态变量?

【问题讨论】:

  • 使用普通变量是不可能的。然而,如果你有一个对象obj,你可以让obj.x在后台访问root.winfo_width(),所以它总是返回“同步”值。
  • 好的。如何设计这样的对象?
  • 或其他解决方案:有没有办法创建 alias :X 只是解释为root.winfo_width() 的快捷方式?
  • 你想用X做什么?
  • 只是在我的代码中到处阅读X很多次(不要写X,只是阅读它)

标签: python variables tkinter global-variables


【解决方案1】:

如果你只是想要一个速记,

X = root.winfo_width

print X()

【讨论】:

  • 谢谢!是否可以将X(而不是X())作为root.winfo_width 的简写?
  • 没有。 X 是一个值。 X() 是一个函数。你想调用一个函数(root.winfo_width);因此,您必须使用函数来执行此操作。
  • 即使你可以X,如果X(一个值)突然且不明显地发生变化,它也会使你的代码完全不可读。
  • 我不是在谈论 lambda,但是如果 root.winfo_width 发生变化,这个“X = root.winfo_width()”不会更新 X 的值
  • @Liarez:您在控制台中输入了错误的内容。不带括号再试一次。
【解决方案2】:

问题在于,尽管 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()。显式优于隐式。

【讨论】:

    【解决方案3】:

    根据您的确切需要,@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
    

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

    【讨论】:

      【解决方案4】:

      我会告诉你如何制作函数的“别名”,希望对你有所帮助。

      def X():
          return root.winfo_width()
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-16
        • 2014-02-12
        • 2021-09-26
        • 1970-01-01
        相关资源
        最近更新 更多