Я собирался вызвать функцию модуля из строки с именем функции в Python, но всякий раз, когда я вызываю свой класс в моей программе, он дает мне эту ошибку: TypeError: unbound method bar() должен быть вызван с экземпляром foo в качестве первого аргумента (вместо этого ничего не получалось)
Кто-нибудь может мне помочь
Вот типичная ситуация, которая создает проблему, которую вы описываете.
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 рекомендуется всегда указывать классы с большой буквы и экземпляры с нижним регистром. Это поможет избежать этой ошибки.
Возьмем этот пример:
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
.