将变量添加到 class 的实例

Add variable to the instance of the class

我正在尝试向 class 的实例添加变量。

在控制台中,我收到此错误:

TypeError: __init__() missing 1 required positional argument: 'view'

这里是代码本身:

import sublime_plugin

class TestMe(sublime_plugin.EventListener):

    def __init__(self, view):
        self.view = view
        self.need_update = False

    def setme():
        need_update = True

    def on_activated(self, view):
        setme()
        if need_update == True:
            print("it works")

我整天都在想办法解决它。我做错了什么?

看起来你的问题的核心是你 classing EventListener 而不是 ViewEventListener.

您看到此错误的原因是 EventListener class 的 __init__ 方法没有参数(self 除外,它是总是出现在 class 方法中)。当 Sublime 创建实例时,它不会传入 view,并且由于您的 __init__ 需要一个,因此您会收到一个错误,提示您缺少位置参数。

这是因为 EventListener 中的事件全部传递给它们适用的 view(如果有),因此 class 不与特定的 view,因此在创建侦听器时不需要一个。

相比之下,ViewEventListener 只提供了 EventListener 提供的事件的一个子集,但它的实例适用于特定视图,因此它的构造函数提供了它适用的视图。在这种情况下,事件本身没有 view 参数,因为侦听器已经知道 view 它与什么相关联。

将所有这些都考虑在内的修改后的代码版本如下所示:

import sublime_plugin

class TestMe(sublime_plugin.ViewEventListener):
    def __init__(self, view):
        super().__init__(view)
        self.need_update = False

    def setme(self):
        self.need_update = True

    def on_activated(self):
        self.setme()
        if self.need_update == True:
            print("it works")

这里的superclass是ViewEventListener,Sublime在创建的时候会传一个view。这也会调用 __init__ 方法的超级 class 版本,而不是将 self.view 设置为传入的视图,这允许它执行默认 class 需要的任何其他设置做(在这种情况下 none,但安全总比遗憾好)。

另外对方法进行了一些调整,因为在这种情况下,每个视图都会有一个为此创建的 class 的唯一实例:

  • setme 接受一个 self 参数,以便它知道它被调用的实例
  • on_activated 不接受 view 参数,因为如果需要它可以访问 self.view
  • setme 的调用需要以 self. 为前缀,以便 python 知道我们要做什么(这也隐含地传递了 self 参数)
  • need_update 的所有访问都以 self. 为前缀,以便每个方法访问对其自身实例唯一的变量版本。