Определите, может ли вызываемый объект вызываться из класса или экземпляра

#python #python-3.x #python-3.6

#python #python-3.x #python-3.6

Вопрос:

Как я могу определить, что какой-либо метод или функция или любой другой вызываемый объект может быть вызван как есть или он привязан к экземпляру?

проверка не охватывает все случаи. Т. Е. связано ли это с экземпляром или с классом:

 PY>inspect.ismethod(object.__subclasshook__)
False
PY>inspect.isfunction(object.__subclasshook__)
False
  

Ответ №1:

Нет другого способа определить, кроме как обратиться к документации. Не существует программного способа определить намерение автора ваших функций. Вы всегда можете вызвать функцию «напрямую» из класса, если вы передаете требуемые аргументы, учитывайте:

 In [1]: class Foo:
   ...:     def speak(self):
   ...:         print('hello')
   ...:

In [2]: Foo().speak()
hello

In [3]: Foo.speak(None)
hello
  

Но очевидно, что автор имел в виду, что speak это метод экземпляра.

Я полагаю, вы могли бы исключить функции с нулевыми параметрами как вызываемые из экземпляра, но это было бы крайне нерегулярной ситуацией для функции в классе (если это на самом деле не staticmethod объект)