Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中对成员函数的引用_Python - Fatal编程技术网

Python中对成员函数的引用

Python中对成员函数的引用,python,Python,我有一个类似于下面的类,它适合我的简单用法 但是,以这种方式调用函数意味着它们无权访问self.,因此我不能使用任何其他成员函数或变量。请注意,某些项共享相同的回调 是否有更好的方法引用或调用函数,以便我可以访问与self相关的其他项目 class Foo: def dostuff(self, bar): # ... # Do stuff with input data, occasionally invoking the right callback

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

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

由于您没有访问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' }
    ]

您的成员函数需要包含“self”参数,即使它们仅用于自调度调用

换言之,您需要类似以下内容:

#!/bin/python
# ...
class ...
   def callback(self, data):
       # ...
。。。需要使用
self.callback(一些数据)

还要注意,您也将.options定义为类数据,而不是成员属性。它不需要任何实例化就可以访问,但是你应该让那些阅读你的代码的人清楚你的意图,一致地将它们称为
Foo.options
,而不要称为
某个实例.options
(后者会起作用,但会通过简单的引用来模糊.options的本质)
误认为是实例成员(属性)。

别忘了在回调中添加
self
参数。感谢这一点,完全有道理。感谢你的第二点,我现在明白了。不过,我丢失的砰砰声是由Ned解释的,特别是他推迟了查找。