Martijnの回答の補足として、Dog
オブジェクト(sparky
)が文字列()ではなくクロージャに格納される理由について次のように追加しますsparky.breed
。これは少なくともあなたの質問の一部だと思います。
これは、.
演算子の動作方法が原因です。関数の呼び出し時にのbreed
属性にアクセスするため、オブジェクト全体を格納する必要があります。文字列のみをクロージャに格納する場合は、文字列を直接参照するように関数コードを変更する必要があります。sparky
sparky
つまり、次のようになります...
>>> class Dog():
... breed = 'electronic dog'
... collar_type = 'microsoft'
...
>>> def get_dog_info_closure():
... sparky = Dog()
... def get_dog_info():
... return sparky.breed
... return get_dog_info
>>> get_dog_info = get_dog_info_closure()
...関数のクロージャには、:Dog
によって返される文字列ではなく、オブジェクトが含まれていることがわかります。sparky.breed
>>> get_dog_info.func_closure
(<cell at 0x10049fa28: instance object at 0x1004a1cf8>,)
>>> get_dog_info.func_closure[0].cell_contents
<__main__.Dog instance at 0x1004a1cf8>
これは、オブジェクトを取得してDog
変更できることを意味し、将来の呼び出しにはその変更が反映されます。
>>> get_dog_info.func_closure[0].cell_contents.breed = ('actual '
'flesh-and-blood dog!')
>>> get_dog_info()
'actual flesh-and-blood dog!'
文字列のみを保存するbreed
には、個別に参照する必要があります。
>>> def get_dog_info_closure():
... sparky = Dog()
... sbreed = sparky.breed
... def get_dog_info():
... return sbreed
... return get_dog_info
...
>>> get_dog_info = get_dog_info_closure()
>>> get_dog_info.func_closure[0].cell_contents
'electronic dog'