关于python:必须使用实例作为第一个a调用未绑定的方法

Unbound method must be called with instance as first a

因此,我有一个类,其中一个类变量被设置为__init__方法中类工厂的输出,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def MyFooFactory():
    def __init__(self, *args):
        # Do __init__ stuff

    def MyBar(myFoo_obj):
        print"MyBar"

    newclass = type("MyFoo", tuple(object), {"__init__": __init__,"MyBar": MyBar} )
    return newclass

class Foo:
    Bar = 0
    def __init__(self):
        if (type(Foo.Bar) is int):
            Bar = MyFooFactory()

    def MyBar(a_list):
        for l in a_list:
            Bar.MyBar(l)

但是,当我尝试这个的时候

1
2
myBar_list = [Foo.Bar() for _ in range(x)]
Foo.MyBar(myBar_list)

类型错误:必须使用foo实例作为第一个参数调用未绑定的方法mybar()(改为get list)

这是因为MyBarFooMyFoo中都有相同的名称,还是因为有别的东西在这里?

作为参考,两个MyBar方法都应该是未绑定的。

谢谢,


python中的实例方法必须使用self作为第一个参数(其中self实际上和其他任何参数一样只是一个正式的参数名—它通过成为第一个参数而绑定到实例),因此

1
2
def MyBar(self, a_list):
    ...

另一方面,如果需要静态方法,则必须使用@staticmethod修饰器:

1
2
3
@staticmethod
def MyBar(a_list):
    ...

另请参见这个答案:python中的@staticmethod和@classmethod有什么区别?


声明

1
Bar = MyFooFactory()

正在分配在Foo.MyBar中调用的本地而不是类级Bar成员。

如果要在方法内部分配它,语法是

1
Foo.Bar = MyFooFactory()

类主体内的范围规则有些令人惊讶。


这是因为你在MyBar中忘记了self参数。

试试这个:

1
2
3
4
5
6
class Foo:
    ...

    def MyBar(self, a_list):
        for l in a_list:
            Bar.MyBar(l)

如果它应该是"未绑定"的方法,请使用@staticmethod修饰器: