将变量添加到 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.
为前缀,以便每个方法访问对其自身实例唯一的变量版本。
我正在尝试向 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.
为前缀,以便每个方法访问对其自身实例唯一的变量版本。