Вы можете сделать это, изучив содержимое self.__class__.__dict__
:
class Test:
pass
def my_unique_method_name(self):
for k, v in self.__class__.__dict__.items():
if v == my_unique_method_name:
print(k)
break # Assume there's only one.
Test.wizardry = my_unique_method_name
t = Test()
t.wizardry() # -> wizardry
Вот более общий (и, следовательно, многократно используемый) способ сделать это, не требуя, чтобы назначенная функция делала что-то особенное- это также, вероятно, будет немного быстрее, поскольку нет цикла for
:
from functools import wraps
class Test:
pass
def my_unique_method_name(self):
pass
def assign_function_to_method(func, cls, name):
@wraps(func) # Optional (but recommended).
def wrapped(*args, **kwargs):
print(name)
return func(*args, **kwargs)
setattr(cls, name, wrapped)
assign_function_to_method(my_unique_method_name, Test, 'wizardry')
t = Test()
t.wizardry() # -> wizardry
Любой подход работает как в Python 2, так и в 3.