在Python中引用成员函数

时间:2014-11-29 22:52:48

标签: python

我有一个类似于下面的类,它适用于我的简单用法。

但是,以这种方式调用函数意味着他们无权访问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 }
    ]

2 个答案:

答案 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的性质)来清楚地表达那些阅读代码的人的意图。通过轻松 被误认为是实例成员(属性)。