【问题标题】:Unbound method must be called with instance as first a必须以实例作为第一个调用未绑定的方法
【发布时间】:2015-09-03 05:47:09
【问题描述】:

所以,我有一个类,其中一个类变量在__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: 未绑定方法 MyBar() 必须以 Foo 实例作为第一个参数调用(改为获取列表)

发生这种情况是因为MyBarFooMyFoo 中具有相同的名称,还是这里还有其他事情?

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

谢谢,

【问题讨论】:

    标签: python class


    【解决方案1】:

    Python 中的实例方法必须self 作为第一个参数(其中self 实际上只是一个形式参数名称,就像任何其他方法一样 - 它由于是第一个参数而绑定到实例一),所以你有

    def MyBar(self, a_list):
        ...
    

    另一方面,如果您确实想要一个 static 方法,则必须 use the @staticmethod decorator:

    @staticmethod
    def MyBar(a_list):
        ...
    

    另请参阅此答案:What is the difference between @staticmethod and @classmethod in Python?

    【讨论】:

    • 那么,如果我当时写Foo.Bar = MyFooFactory(),这行得通吗?
    • 你可以在inside类定义中做到这一点(见@6502答案下的我的评论)。
    【解决方案2】:

    因为你忘记了MyBar中的self参数

    试试这个:

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

    如果它应该是“未绑定”方法,请使用 @staticmethod decorator:

    【讨论】:

    • 我没忘记,应该是unbound的方法。
    【解决方案3】:

    声明

    Bar = MyFooFactory()
    

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

    如果你想在方法中分配它,语法是

    Foo.Bar = MyFooFactory()
    

    类体内的作用域规则有点令人惊讶。

    【讨论】:

    • 我明白了!所以这就是我做错了。那么我将如何分配班级级别的Bar
    • class Foo: \n Bar = MyFooFactory__init__方法之外)应该做你想做的事。
    猜你喜欢
    • 1970-01-01
    • 2014-09-10
    • 2014-12-10
    • 1970-01-01
    • 2017-05-10
    • 2018-05-10
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    相关资源
    最近更新 更多