首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getattr错误

getattr错误
EN

Stack Overflow用户
提问于 2011-08-25 22:10:01
回答 2查看 1.5K关注 0票数 1

我正要去Calling a function of a module from a string with the function's name in Python,但是每当我在我的程序中调用我的类时,它都会给我这样的错误:TypeError: unbound method bar()必须以foo实例作为第一个参数来调用(实际上什么也没有得到)

有人能帮帮我吗?

EN

回答 2

Stack Overflow用户

发布于 2011-08-25 22:13:44

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

代码语言:javascript
复制
class Foo(object):
    def bar(self,x):
        print(x)

foo=Foo()

调用gettatrr(Foo,'bar')将返回未绑定的方法Foo.bar

代码语言:javascript
复制
getattr(Foo,'bar')(1)

结果:

TypeError:调用未绑定的方法TypeError()时,必须将Foo实例作为第一个参数(改为使用int实例)

方法Foo.bar被称为“未绑定”,因为调用时不会提供任何实例(如foo)作为第一个参数。毕竟,当只提供了Foo类时,它怎么能这样呢?

另一方面,如果你提供了一个类的实例:

代码语言:javascript
复制
getattr(foo,'bar')(1)

收益率

代码语言:javascript
复制
1

由于foo.bar是一个“绑定”方法--当调用foo.bar时,将提供foo作为第一个参数。

PS。您的错误消息显示,"...called with foo instance ...“。与我在上面发布的错误消息相比,您的类似乎被称为lowercased foo。请注意,PEP8 style guide建议始终使用大写字母命名类,使用小写字母命名实例。这样做将帮助您避免此错误。

票数 9
EN

Stack Overflow用户

发布于 2011-08-25 22:35:45

让我们举个例子:

代码语言:javascript
复制
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

然后,您可以根据您如何调用它们来获得不同的成功度量:

代码语言:javascript
复制
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函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7191852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档