我有一个类似于下面的类,它适用于我的简单用法。
但是,以这种方式调用函数意味着他们无权访问self.
,因此我无法使用任何其他成员函数或变量。请注意,某些项目共享相同的回调。
是否有更好的方式来引用或调用这些功能,以便我可以访问与self
相关的其他项目?
class Foo:
def dostuff(self, bar):
# ...
# Do stuff with input data, occasionally invoking the right callback
# function like so:
self.options[i]['func'](mydata)
def callback1(data):
pass
def callback2(data):
pass
options = [
0x10: { 'name': 'cat', 'func': callback1 },
0x20: { 'name': 'dog', 'func': callback2 },
0x40: { 'name': 'emu', 'func': callback2 },
0x80: { 'name': 'bat', 'func': callback2 }
]
答案 0 :(得分:1)
由于您无权访问self,因此您需要推迟查找方法。您可以在dostuff
:
class Foo:
def dostuff(self, bar):
# ...
# Do stuff with input data, occasionally invoking the right callback
# function like so:
method = getattr(self, self.options[i]['func'])
method(mydata)
def callback1(self, data):
pass
def callback2(self, data):
pass
options = [
0x10: { 'name': 'cat', 'func': 'callback1' },
0x20: { 'name': 'dog', 'func': 'callback2' },
0x40: { 'name': 'emu', 'func': 'callback2' },
0x80: { 'name': 'bat', 'func': 'callback2' }
]
答案 1 :(得分:0)
您的会员功能需要包含“自我”参数,即使它们仅用于自我分配的呼叫。
换句话说,你需要这样的东西:
#!/bin/python
# ...
class ...
def callback(self, data):
# ...
...需要使用self.callback(some_data)
另请注意,您已将Too.options定义为类数据而非成员属性。它可以在没有任何实例化的情况下访问,但是你应该通过将这些代码一致地称为Foo.options
而不是some_instance.options
(后者可以工作,但是模糊了.options的性质)来清楚地表达那些阅读代码的人的意图。通过轻松
被误认为是实例成员(属性)。