だから、私は問題なくこれを行うことができることを知っています:
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)