必须使用实例作为第一个调用未绑定方法

时间:2015-09-03 05:47:09

标签: python class

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

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)

但是,当我尝试这个时

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

TypeError:未绑定方法必须使用Foo实例作为第一个参数调用MyBar()(改为获取列表)

是否发生这种情况是因为MyBarFooMyFoo中具有相同的名称,或者此处还有其他内容?

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

谢谢,

3 个答案:

答案 0 :(得分:2)

这是因为您忘记了self

中的MyBar参数

试试这个:

class Foo:
    ...

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

如果它应该是" unbound"方法使用@staticmethod decorator

答案 1 :(得分:2)

声明

Bar = MyFooFactory()

正在分配一个本地,而不是Bar

中调用的类级别Foo.MyBar成员

如果要在方法内分配语法

Foo.Bar = MyFooFactory()

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

答案 2 :(得分:2)

Python 中的实例方法必须self作为第一个参数(其中def MyBar(self, a_list): ... 实际上只是一个正式的参数名称 - 它通过美德绑定到实例成为第一个,所以你有

@staticmethod
def MyBar(a_list):
    ...

另一方面,如果您确实需要静态方法,则必须use the @staticmethod decorator

{{1}}

另见答案:What is the difference between @staticmethod and @classmethod in Python?