getattr出错

时间:2011-08-25 14:10:01

标签: python

我要去Calling a function of a module from a string with the function's name in Python但是每当我在我的程序中调用我的类时它会给我这个错误:TypeError:必须使用foo实例作为第一个参数调用未绑定的方法bar()(没有任何改为)

有人可以帮助我

2 个答案:

答案 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函数。