ใน Python การปิดเป็นตัวอย่างของฟังก์ชันที่มีตัวแปรเชื่อมโยงกับฟังก์ชันนั้นอย่างไม่เปลี่ยนรูป
ในความเป็นจริงแบบจำลองข้อมูลอธิบายสิ่งนี้ในคำอธิบาย__closure__
คุณลักษณะของฟังก์ชัน:
ไม่มีหรือทูเปิลของเซลล์ที่มีการผูกสำหรับตัวแปรอิสระของฟังก์ชัน อ่านเท่านั้น
เพื่อสาธิตสิ่งนี้:
def enclosure(foo):
def closure(bar):
print(foo, bar)
return closure
closure_instance = enclosure('foo')
closure_instance
เห็นได้ชัดว่าเรารู้ว่าตอนนี้เรามีฟังก์ชั่นชี้ไปที่มาจากชื่อตัวแปร ถ้าเราเรียกมันด้วยอ็อบเจกต์bar
มันควรจะพิมพ์สตริง'foo'
และอะไรก็ตามที่เป็นตัวแทนของสตริงbar
มี
ในความเป็นจริงสตริง 'foo' ถูกผูกไว้กับอินสแตนซ์ของฟังก์ชันและเราสามารถอ่านได้โดยตรงที่นี่โดยการเข้าถึงcell_contents
แอตทริบิวต์ของเซลล์แรก (และเท่านั้น) ในทูเพิลของ__closure__
แอตทริบิวต์:
>>> closure_instance.__closure__[0].cell_contents
'foo'
นอกจากนี้วัตถุเซลล์จะอธิบายไว้ในเอกสาร C API:
ออบเจ็กต์ "เซลล์" ถูกใช้เพื่อใช้ตัวแปรที่อ้างอิงโดยขอบเขตต่างๆ
และเราสามารถแสดงให้เห็นถึงการใช้งานการปิดของเราโดยสังเกตว่า'foo'
ติดอยู่ในฟังก์ชันและไม่เปลี่ยนแปลง:
>>> closure_instance('bar')
foo bar
>>> closure_instance('baz')
foo baz
>>> closure_instance('quux')
foo quux
และไม่มีอะไรสามารถเปลี่ยนแปลงได้:
>>> closure_instance.__closure__ = None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: readonly attribute
ฟังก์ชันบางส่วน
ตัวอย่างที่ให้มาใช้การปิดเป็นฟังก์ชันบางส่วน แต่ถ้านี่เป็นเป้าหมายเดียวของเราเป้าหมายเดียวกันก็สามารถทำได้ด้วย functools.partial
>>> from __future__ import print_function
>>> partial_function = functools.partial(print, 'foo')
>>> partial_function('bar')
foo bar
>>> partial_function('baz')
foo baz
>>> partial_function('quux')
foo quux
มีการปิดที่ซับซ้อนมากขึ้นเช่นกันซึ่งอาจไม่พอดีกับตัวอย่างฟังก์ชันบางส่วนและฉันจะสาธิตให้ดูเพิ่มเติมเมื่อเวลาเอื้ออำนวย
nonlocal
มีการเพิ่มเข้ามาใน python 3 python 2.x ไม่มีการปิดแบบเต็มอ่าน - เขียน (กล่าวคือคุณสามารถอ่านปิดเหนือตัวแปร แต่ไม่สามารถเปลี่ยนค่าได้)