我试图将变量添加到类的实例中。
在控制台中,我收到此错误:
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")
我花了一整天的时间试图找出解决问题的不同方法。我做错了什么?
答案 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.
为前缀,以便每个方法都可以访问自己实例唯一的变量版本。