(в некоторой степени) отвечая на комментарий wim:
Я сам не нашел хорошего варианта использования, но вы можете устанавливать произвольные функции как методы произвольных экземпляров.Это хороший стиль?Вероятно, есть лучший способ в большинстве случаев.Но вы можете, и я покажу, как.
Вы просто устанавливаете атрибут, который оказывается функцией вашего экземпляра.
Функции (не данные) дескрипторы и вы можете использовать их метод __get__
для исправления первого параметра.
Демонстрация:
>>> class myClass:
...: def __repr__(self): # nicer output for demo
...: return '<myClass object>'
...: def create_method_on_instance(self, name, function):
...: setattr(self, name, function.__get__(self))
>>>
>>> m1 = myClass()
>>> m2 = myClass()
>>> m1.create_method_on_instance('foo', lambda self, x, y: print(self, x + y))
>>> m2.create_method_on_instance('foo', lambda self, x, y: print(self, x - y))
>>>
>>> m1.foo(3, 4)
<myClass object> 7
>>> m2.foo(3, 4)
<myClass object> -1
Я не могу повторить все из дескриптора HowTo Раздел функций и методов здесь, но он разбивается следующим образом:
Когда вы обращаетесь к атрибуту функции в экземпляре через точечную нотацию, функция __get__
метод вызываться не будет.
Однако метод функции __get__
отвечает за привязку первого аргумента (обычно называемого self
) функции к рассматриваемому экземпляру (таким образом, создавая метод).
Вы все еще можете вызвать __get__
вручную, если хотите создать методы из произвольных функций в произвольных экземплярах.Это может быть немного глупо, так как вы можете даже связать первый аргумент функции с каким-то экземпляром, а затем установить метод как атрибут другого объекта;)
>>> class Unrelated:
...: pass
...:
>>> u = Unrelated()
>>> u.foo = (lambda self, x, y: print(self, x+y)).__get__(m1)
>>> u.foo(3, 4)
<myClass object> 7