2011-08-25 71 views
1

我要Calling a function of a module from a string with the function's name in Python但每当我打电话给我的班级我的程序它给我这个错误:类型错误:未绑定的方法bar()必须以foo例如被称为第一个参数(什么都没有代替)误差GETATTR

有人可以帮我

+2

向我们显示您的代码。 – NPE

+0

确实需要查看代码才能确定,但​​听起来像您正在调用某个类的成员,而该方法不是[classmethod](http://docs.python.org/library/functions.html#classmethod )。 –

回答

8

这是一个典型的情况,它会产生你描述的问题。

class Foo(object): 
    def bar(self,x): 
     print(x) 

foo=Foo() 

调用gettatrr(Foo,'bar')返回不受约束的方法,Foo.bar

getattr(Foo,'bar')(1) 

导致

TypeError: unbound method bar() must be called with Foo instance as first argument (got int instance instead)

的方法,Foo.bar,是因为没有实例(如foo)打算调用时被作为第一个参数提供,称为“未结合”。毕竟,当仅仅提供Foo类时,怎么可能?

在另一方面,如果提供的类的实例:

getattr(foo,'bar')(1) 

产生

1 

因为foo.bar是“结合”的方法 - 将foo作为第一供给当调用foo.bar时参数。

PS。您的错误消息说:“......用foo实例调用......”。与上面发布的错误消息相比,您的班级似乎被称为小写foo。请注意,PEP8 style guide建议始终使用大写字母命名类,并使用小写字母命名实例。这样做可以帮助你避免这个错误。

+0

+1阅读凯尔成功的心态 – Simon

+0

+2阅读凯尔成功的心态 – Ivan

1

让我们这个例子:

class Foo: 
    def bar(self): 
    print 'bar' 
    @classmethod 
    def baz(cls): 
    print 'baz' 
    @staticmethod 
    def qux(): 
    print 'qux' 

def quux(): 
    print 'quux' 
Foo.quux = quux # note: Foo.quux is a function attribute NOT a method 

然后你就可以有不同的成功措施,这取决于你如何调用这些:

f = Foo() 
f.bar() # works 
getattr(f, 'bar')() # works 
getattr(Foo, 'bar')() # TypeError 
getattr(Foo, 'bar')(f) # works 
f.baz() # works 
getattr(f, 'baz')() # works 
getattr(Foo, 'baz')() # works 

等。游戏中的基本思想是,当调用方法时,使用语法obj.method(...),该对象本身作为第一个参数self传递;但是当相同的可调用作为类的一个属性被寻址时,那么这个特殊的替换就没有完成。这也适用于getattr功能。