請考慮Python中的策略模式示例(從示例here改編而來)。在這種情況下,替代策略是一種功能。python方法如何自動接收'self'作爲第一個參數?
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
作爲第一個參數?
我能找到的唯一區別是當我檢查默認策略和替代策略的屬性時。
>>> print dir(s0.execute)
['__cmp__', '__func__', '__self__', ...]
>>> print dir(s1.execute)
# does not have __self__ attribute
是否__self__
屬性對s0.execute
(方法)上s1.execute
(功能)的存在,但缺乏它在某種程度上解釋這種行爲差異?這一切如何在內部工作?
你可以認爲instance.method(ARG)'作爲'InstanceClass.method的簡寫的'(實例,arg)'。 Python試圖讓事情儘可能簡單明瞭,我發現這是一種「透明」的方式來訪問實例,該實例稱爲函數 –