将变量添加到类

时间:2017-03-28 20:03:59

标签: sublimetext2 sublimetext3 sublimetext sublime-text-plugin

我试图将变量添加到类的实例中。

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

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")

我花了一整天的时间试图找出解决问题的不同方法。我做错了什么?

1 个答案:

答案 0 :(得分:1)

您的问题的核心似乎是您将EventListener而非ViewEventListener继承为子类。

您看到此错误的原因是__init__类的EventListener方法不带参数(self除外,它始终存在于课堂中方法)。当Sublime创建实例时,它不会传递view,并且由于您的__init__需要一个实例,因此您会收到错误消息,指出您错过了位置参数。

这是因为EventListener中的事件都传递了它们适用的view(如果有的话),因此该课程与一个特定的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")

这里的超类是ViewEventListener,Sublime在创建时会传递view。这也会调用__init__方法的超类版本,而不是将self.view设置为传入的视图,这允许它执行默认类需要执行的任何其他设置(在这种情况下没有,但是比抱歉更安全。

此外,方法会稍微调整一下,因为在这种情况下,每个视图都会为此创建此类的唯一实例:

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