あなたが思っているよりもはるかに多くのものがあります。デフォルトは静的(= 1 つのオブジェクトを指す定数参照) であり、定義のどこかに格納されていると考えてください。メソッド定義時に評価されます。インスタンスではなく、クラスの一部として。それらは一定であるため、 に依存することはできませんself
。
ここに例があります。直感に反しますが、実際には完全に理にかなっています。
def add(item, s=[]):
s.append(item)
print len(s)
add(1) # 1
add(1) # 2
add(1, []) # 1
add(1, []) # 1
add(1) # 3
これは印刷されます1 2 1 1 3
。
と同じように動作するため、
default_s=[]
def add(item, s=default_s):
s.append(item)
明らかに、 を変更するdefault_s
と、これらの変更が保持されます。
など、さまざまな回避策があります。
def add(item, s=None):
if not s: s = []
s.append(item)
またはこれを行うことができます:
def add(self, item, s=None):
if not s: s = self.makeDefaultS()
s.append(item)
その後、メソッドmakeDefaultS
は にアクセスできますself
。
別のバリエーション:
import types
def add(item, s=lambda self:[]):
if isinstance(s, types.FunctionType): s = s("example")
s.append(item)
ここで、 のデフォルト値s
はファクトリー関数です。
これらすべての手法を組み合わせることができます。
class Foo:
import types
def add(self, item, s=Foo.defaultFactory):
if isinstance(s, types.FunctionType): s = s(self)
s.append(item)
def defaultFactory(self):
""" Can be overridden in a subclass, too!"""
return []