Нет ничего особенного в классе, который вы создали (это даже не подкласс ModuleType
), поэтому нет ничего особенного в его методе __call__
. Если вы хотите вызвать его с аргументами, просто добавьте параметры в определение __call__
:
import sys
class foo(object):
def __call__(self, x):
return f'callable, and called with {x}'
sys.modules[__name__] = foo()
И теперь вы можете передать ему аргумент, точно так же, как любой другой вызываемый объект:
import foo
print(foo('hello'))
А на выходе :
callable, and called with hello
Из комментариев вы пытались это сделать:
def __call__(a, self):
return a
Но, как и все методы в Python, __call__
хочет, чтобы self
был первым. Он не заботится об именах (если вы не вызываете его с помощью аргументов ключевых слов), а только о порядке: первый параметр получает получателя (foo
in foo('hello')
), даже если вы назвали этот параметр a
, и второй параметр получает первый нормальный аргумент ('hello'
), даже если вы назвали этот параметр self
.
Итак, вы передаете модуль foo
в качестве первого параметра, a
, а вы return a
, поэтому он возвращает foo
.
Вот почему вы получили это:
<sta.foo object at 0x10faee6a0>
Это не ошибка, это совершенно правильный вывод, который вы получаете, когда вы распечатываете экземпляр класса, который не определяет __repr__
или __str__
.