我要Calling a function of a module from a string with the function's name in Python但每当我打电话给我的班级我的程序它给我这个错误:类型错误:未绑定的方法bar()必须以foo例如被称为第一个参数(什么都没有代替)误差GETATTR
有人可以帮我
我要Calling a function of a module from a string with the function's name in Python但每当我打电话给我的班级我的程序它给我这个错误:类型错误:未绑定的方法bar()必须以foo例如被称为第一个参数(什么都没有代替)误差GETATTR
有人可以帮我
这是一个典型的情况,它会产生你描述的问题。
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建议始终使用大写字母命名类,并使用小写字母命名实例。这样做可以帮助你避免这个错误。
让我们这个例子:
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
功能。
向我们显示您的代码。 – NPE
确实需要查看代码才能确定,但听起来像您正在调用某个类的成员,而该方法不是[classmethod](http://docs.python.org/library/functions.html#classmethod )。 –