0

だから、私は問題なくこれを行うことができることを知っています:

button = widget.libray.Button()

class X():
  @button.on_click
  def click(self, event):
    ...

問題なく。

...しかし、「ボタン」がクラススコープの外にあるため、イライラします。これをクラス プロパティにしたいと思います。クラス メンバーに対して @blah 装飾構文を使用するにはどうすればよいですか?

次のように、デコレータをまったく使用できません。

class UiDemo(cocos.cocosnode.CocosNode):

  def on_enter(self):
    self.b = Button(text='Hello World')
    self.bt = b.event(self.bt) # <--- !!! Instead of decorator!
    vbox = VBox(elements=[self.b])
    self.dialog = Dialog(title='My Dialog', x=100, y=100, content=vbox, width=200, height=100)
    cocos.director.director.window.push_handlers(self.dialog)

  # @self.b.event doesn't work here, obviously.
  def bt(self, button):
     print('Button pressed: %s' % button)

  def on_exit(self):
    cocos.director.director.window.remove_handlers(self.dialog)

  def draw(self):
    self.dialog.on_draw()

class Client:
  def run(self):
    cocos.director.director.init()
    test = UiDemo()
    main_scene = cocos.scene.Scene(test)
    cocos.director.director.run (main_scene)

つまり、問題がわかりました。クラスが定義されているときにメソッドがクラスで定義されているため(推測)、init()ステップでウィジェットを作成しても、クラス定義が解析される時点では存在しないため、その時点でデコレータとして使用することはできません。

私が疑問に思っているのは、これを回避する方法があるかどうかです。

クラスにアタッチされた何かのインスタンスをデコレータ プロパティで参照したいというケースはかなり多いのではないでしょうか?

(上記の例からわかるように、これ単なる「もしも」の状況ではありません。今週、冗長な self.func = self.instance.dec(self.func) を使用することになったのはこれが 2 回目です。これを行うためのフォーム)

助言がありますか?

(...明らかに、それ以外は、それがばかげているため、それを行わないライブラリを使用します。それは実際には解決策ではありません。:P)

4

2 に答える 2

1

必要がないのに飾りたいので、混乱が生じるようです。本当に必要なのは、コールバックを登録することです。登録する以外に、コールバックを装飾しても意味がありません。

すでに持っているように、ボタンをメンバーとして持って、それにコールバックを登録するだけです。

def on_enter(self):
    self.b = Button(text='Hello World')
    b.event(self.bt) # register, don't decorate

さらに、クラスが定義されているときに装飾が行われ、オブジェクトが作成されたときにのみメンバーがインスタンス化されるため、グローバルを作成しない限り、デコレーターを使用することはできません。したがって、その時点でコールバックを登録することはできません。点。ButtonButton

于 2013-04-07T06:03:32.627 に答える