Рассмотрим этот пример шаблона стратегии в 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
(функция) как-то объясняет эту разницу в поведении? Как все это работает внутри компании?