我要去Calling a function of a module from a string with the function's name in Python但是每当我在我的程序中调用我的类时它会给我这个错误:TypeError:必须使用foo实例作为第一个参数调用未绑定的方法bar()(没有任何改为)
有人可以帮助我
答案 0 :(得分:9)
这是产生您描述的问题的典型情况。
class Foo(object):
def bar(self,x):
print(x)
foo=Foo()
调用gettatrr(Foo,'bar')
会返回未绑定的方法Foo.bar
。
getattr(Foo,'bar')(1)
结果
TypeError:必须使用Foo实例作为第一个参数调用未绑定的方法bar()(改为使用int实例)
方法Foo.bar
被称为“未绑定”,因为在调用时,不会提供任何实例(例如foo
)作为第一个参数。毕竟,只有提供课程Foo
时怎么可能呢?
另一方面,如果您提供该类的实例:
getattr(foo,'bar')(1)
产量
1
因为foo.bar
是一种“绑定”方法 - foo
将作为调用foo.bar
时的第一个参数提供。
PS。您的错误消息显示“...使用 foo 实例...”调用。与我上面发布的错误消息相比,您的类似乎被称为小写foo
。请注意,PEP8 style guide建议始终使用大写字母命名类,使用小写字母命名实例。这样做可以帮助您避免此错误。
答案 1 :(得分: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
参数传递;但是当相同的callable作为类的属性被寻址时,则不会进行此特殊替换。这也适用于getattr
函数。