Вы видите некоторые эффекты скрытого механизма Python.
Когда вы пишете f = MyClass.__dict__['mymethodname']
, вы получаете необработанную реализацию «mymethodname», которая является простой функцией. Чтобы вызвать его, вам нужно передать дополнительный параметр, экземпляр класса.
Когда вы пишете f = MyClass.mymethodname
(обратите внимание на отсутствие скобок после mymethodname), вы получаете несвязанный метод класса MyClass, который является экземпляром MethodType
, который оборачивает необработанную функцию, которую вы получили выше. Чтобы вызвать его, вам нужно передать дополнительный параметр, экземпляр класса.
Когда вы пишете f = MyClass().mymethodname
(обратите внимание, что я создал объект класса MyClass, прежде чем использовать его метод), вы получаете связанный метод экземпляра класса MyClass. Вам не нужно передавать ему дополнительный экземпляр класса, поскольку он уже хранится внутри него.
Чтобы получить упакованный метод (связанный или несвязанный) по его имени, указанному в виде строки, используйте getattr
, как отмечено gnibbler . Например:
unbound_mth = getattr(MyClass, "mymethodname")
или
bound_mth = getattr(an_instance_of_MyClass, "mymethodname")