Как метод Python автоматически принимает «self» в качестве первого аргумента?

Рассмотрим этот пример шаблона стратегии в Python (адаптированный из примера здесь ). В этом случае альтернативной стратегией является функция.

class StrategyExample(object):
    def __init__(self, strategy=None) :
        if strategy:
             self.execute = strategy

    def execute(*args):
        # I know that the first argument for a method
        # must be 'self'. This is just for the sake of
        # demonstration 
        print locals()

#alternate strategy is a function
def alt_strategy(*args):
    print locals()

Вот результаты для стратегии по умолчанию.

>>> s0 = StrategyExample()
>>> print s0
<__main__.StrategyExample object at 0x100460d90>
>>> s0.execute()
{'args': (<__main__.StrategyExample object at 0x100460d90>,)}

В приведенном выше примере s0.execute - это метод (а не обычная функция) и, следовательно, первый аргумент в args ], как и ожидалось, является self .

Вот результаты для альтернативной стратегии.

>>> s1 = StrategyExample(alt_strategy)
>>> s1.execute()
{'args': ()}

В этом случае s1.execute является простой ванильной функцией и, как и ожидалось, не получает self . Следовательно, args пуст. Подождите! Как это произошло?

И метод, и функция были вызваны одинаково. Каким образом метод автоматически получает self в качестве первого аргумента? И когда метод заменяется простой ванильной функцией, как он не получает self [118 1991] в качестве первого аргумента?

Единственное различие, которое мне удалось найти, это когда я исследовал атрибуты стратегии по умолчанию и альтернативной стратегии.

>>> print dir(s0.execute)
['__cmp__', '__func__', '__self__', ...]
>>> print dir(s1.execute)
# does not have __self__ attribute

Имеется ли атрибут __ self __ в s0.execute (метод), но его отсутствие в s1.execute (функция) как-то объясняет эту разницу в поведении? Как все это работает внутри компании?

11
задан Community 23 May 2017 в 12:01
поделиться