Преобразовать тип встроенной функции в тип метода (в Python 3)
==============================================================

Рассмотрим простую функцию, такую как

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

Теперь это не будет работать, так как соглашение о вызовах на уровне C будет нарушено. Например:

Но в Python 2 мы можем преобразовать функцию в несвязанный метод, выполнив:

**How can I accomplish this same thing in Python 3?**

Одним простым способом является использование тонкой обертки:

Есть ли более эффективный способ сделать это?

Импортируйте расширение следующим образом:

В вашем классе вы пишете:

Это кажется более читабельным и может быть более эффективным.



Так что собственные имена**functions** а также**bound methods**, Теперь вы можете посмотреть, как[Bind an Unbound Method](https://stackoverflow.com/a/1015405/1149736) и вы, вероятно, в конечном итоге читать о[descriptors](https://docs.python.org/3/howto/descriptor.html):

In general, a descriptor is an object attribute with "binding
 behavior", one whose attribute access has been overridden by methods
 in the descriptor protocol. Those methods are `__get__`, `__set__`, and
 `__delete__`. If any of those methods are defined for an object, it is said to be a descriptor.

Вы можете легко преобразовать функцию в метод, просто используя различные вызовы`__get__`

И это работает как шарм:

Вы можете легко добавить этиnewly bounded methods к объектам:

Или создайте свой собственныйdescriptor что будет конвертироватьfunction вbound method:

И вы также можете видеть, что это хорошо согласуется с[function/bound method principles](https://docs.python.org/3/howto/descriptor.html#functions-and-methods):

Class dictionaries store methods as functions. In a class definition, methods are written using def and lambda, the usual tools for creating functions. The only difference from regular functions is that the first argument is reserved for the object instance. By Python convention, the instance reference is called self but may be called this or any other variable name.

To support method calls, functions include the `__get__()` method for binding methods during attribute access. This means that all functions are non-data descriptors which return bound or unbound methods depending whether they are invoked from an object or a class.

А такжеfunctions становитсяbound method во время инициализации экземпляра: