это работает так, вам придется спросить Гвидо ван Россума, но я могу дать вам возможный обходной путь:

ываясь на моем пониманииМодель данных Pythonи, в частности, подраздел «Методы экземпляра», всякий раз, когда вы читаете атрибут, значение которого имеет тип «пользовательская функция», возникает некоторая магия, и вы получаете связанный метод экземпляра вместо действительной, исходной функции. Это волшебство, почему вы не передаете явноself параметр, когда вы вызываете метод.

Но тогда я ожидал бы, что смогу заменить метод объекта функцией с такой же сигнатурой:

class Scriptable:
    def __init__(self, script = None):
        if script is not None:
            self.script = script   # replace the method
    def script(self):
        print("greetings from the default script")

>>> scriptable = Scriptable()
>>> scriptable.script()
greetings from the default script

>>> def my_script(self):
...     print("greetings from my custom script")
...
>>> scriptable = Scriptable(my_script)
>>> scriptable.script()
Traceback (most recent call last):
  ...
TypeError: script() takes exactly 1 positional argument (0 given)

Я создаю экземплярScriptableи установив егоscript атрибут пользовательской функции с одним параметром, как в классе. Поэтому, когда я читаюscriptable.script атрибут, я бы ожидал, что магия сработает и даст мне связанный метод экземпляра, который не принимает параметров (так же, как я получаю, когда я не заменилscript). Вместо этого он, похоже, возвращает ту же самую функцию, которую я передал,self параметр и все. Магия привязки метода не происходит.

Почему магия привязки метода работает, когда я определяю метод внутри объявления класса, а не когда я присваиваю атрибут? Что заставляет Python по-разному относиться к этим ситуациям?

Я использую Python3, если это имеет какое-либо значение.

Ответы на вопрос(4)

Ваш ответ на вопрос