Ошибка с getattr

1

Я собирался вызвать функцию модуля из строки с именем функции в Python, но всякий раз, когда я вызываю свой класс в моей программе, он дает мне эту ошибку: TypeError: unbound method bar() должен быть вызван с экземпляром foo в качестве первого аргумента (вместо этого ничего не получалось)

Кто-нибудь может мне помочь

  • 2
    Покажите нам свой код.
  • 0
    На самом деле нужно видеть код, чтобы быть уверенным, но похоже, что вы вызываете член класса, а метод не является методом класса .
Теги:

2 ответа

8

Вот типичная ситуация, которая создает проблему, которую вы описываете.

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

foo=Foo()

Вызов gettatrr(Foo,'bar') возвращает несвязанный метод Foo.bar.

getattr(Foo,'bar')(1)

приводит к

TypeError: unbound метод bar() должен быть вызван с экземпляром Foo в качестве первого аргумента (вместо этого используется int int)

Метод Foo.bar называется "unbound", потому что ни один экземпляр (например, foo) не будет предоставлен в качестве первого аргумента при вызове. В конце концов, как это могло произойти, когда поставлялся только класс Foo?

С другой стороны, если вы укажете экземпляр класса:

getattr(foo,'bar')(1)

доходность

1

поскольку foo.bar - это "связанный" метод - foo будет предоставлен в качестве первого аргумента при вызове foo.bar.

PS. В сообщении об ошибке говорится: "... вызван с экземпляром foo...". По сравнению с сообщением об ошибке, которое я разместил выше, вы видите, что ваш класс называется lowercased foo. Обратите внимание, что в руководстве по стилю PEP8 рекомендуется всегда указывать классы с большой буквы и экземпляры с нижним регистром. Это поможет избежать этой ошибки.

  • 0
    +1 за чтение мыслей Кайла с успехом
  • 0
    +2 к чтению мыслей Кайла с успехом
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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню