1

変数をクラスのインスタンスに追加しようとしています。コンソールでクラスのインスタンスに変数を追加する

、私はこのエラーを取得:

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

ViewEventListenerではなく、EventListenerをサブクラス化しているように見えます。

このエラーが表示される理由は、クラスの__init__メソッドが引数をとりません(例外は、クラスメソッドに常に存在するselfを除く)。 Sublimeがインスタンスを作成するときにviewには渡されず、__init__には1つが必要なため、位置パラメータが欠落しているというエラーが発生します。クラスは、リスナーが作成されたときに1が必要とされていないので、一つの特定のviewに関連付けるとしないので、EventListenerすべてのイベントが、彼らは(もしあれば)に適用されることをviewに渡すため

です。

ViewEventListenerは、EventListenerのイベントのサブセットのみを提供しますが、そのインスタンスは特定のビューに適用されるため、そのコンストラクタには適用されるビューが提供されます。この場合、イベント自体には、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あり、それが作成されたときサブライムがviewを通過しますいます。これは、self.viewを渡されたビューに設定するのではなく、__init__メソッドのスーパークラスバージョンを呼び出します。これにより、デフォルトのクラスが行う必要のある他の設定(この場合は何もしませんが、残念ながら安全です)が実行できます。

この場合には、すべてのビューはそれのために作成された、このクラスの一意のインスタンスを持つことになりますので、さらに方法は、少し調整されている:それはそれが何であるか、インスタンスを知っているように、

  • setmeself引数を取りますそれはself.viewへのアクセス権を持っているので
  • on_activatedのために呼び出されていることview引数を取りませんPythonは知っているように、それはそれを必要とする場合setmeから
  • コールはself.接頭辞する必要があります
  • need_updateのすべてのアクセスには接頭辞self.が付くため、各メソッドはそれぞれのインスタンスに固有の変数のバージョンにアクセスします。
関連する問題