Computer >> Máy Tính >  >> Lập trình >> Python

Python đóng cửa?

Để hiểu rõ hơn về cách đóng của python, trước tiên chúng ta hãy hiểu hàm và lớp python được lồng vào nhau là gì. Nói tóm lại, python đóng cũng là một hàm đóng gói dữ liệu bằng mã.

Hàm lồng nhau trong Python

Một hàm được định nghĩa bên trong một hàm khác được gọi là một hàm lồng nhau. Một hàm lồng nhau có thể truy cập các biến của phạm vi bao quanh.

def funcOut():
   print("This is outer function.")
   def funcIn():
      print("This function is defined inside funcOut. \nThis function(funcIn) is called\
nested function.")
   print("We can call nested function here.")
   funcIn()
print("We are in outer function.\nCalling funcOut.")
funcOut()

Đầu ra

We are in outer function.
Calling funcOut.
This is outer function.
We can call nested function here.
This function is defined inside funcOut.
This function(funcIn) is called nested function.

Vì vậy, funcIn là hàm lồng nhau được định nghĩa bên trong funcOut. Bằng cách xem kết quả ở trên, chúng ta có thể hiểu trình tự gọi của các hàm.

Trong trường hợp chúng ta muốn có tất cả các chức năng của funcIn từ funcOut, vì điều đó, chúng ta có thể phải thực hiện “trả về funcIn” trong chương trình trên, điều này được gọi là đóng trong python.

Tóm lại, bao đóng là một hàm (đối tượng) ghi nhớ môi trường tạo của nó (phạm vi bao quanh).

def closureFunc(start):
   def incrementBy(inc):
      return start + inc
   return incrementBy
closure1 = closureFunc(9)
closure2 = closureFunc(90)
print ('clsure1(3) = %s' %(closure1(3)))
print ('closure2(3) = %s' %(closure2(3)))

Đầu ra

clsure1(3) = 12
closure2(3) = 93

Gọi biến Closeure1 (thuộc kiểu hàm) với hàm bao đóng1 (3) sẽ trả về 12, trong khi đó, đóng cửa sổ 2 (3) sẽ trả về 93. Trong khi đó, cả hai đều tham chiếu đến cùng một hàm gia được liên kết với nhau bằng mã định danh đóng lại, dẫn đến các kết quả khác nhau.

Thuộc tính
__closure__ attribute and cell objects

Để có thêm thông tin, chúng tôi có thể sử dụng thuộc tính __closure__ và các đối tượng ô:

def closureFunc(start):
   def incrementBy(inc):
      return start + inc
   return incrementBy

a= closureFunc(9)
b = closureFunc(90)

print ('type(a)=%s' %(type(a)))
print ('a.__closure__=%s' %(a.__closure__))
print ('type(a.__closure__[0])=%s' %(type(a.__closure__[0])))
print ('a.__closure__[0].cell_contents=%s' %(a.__closure__[0].cell_contents))

print ('type(b)=%s' %(type(b)))
print ('b.__closure__=%s' %(b.__closure__))
print ('type(b.__closure__[0])=%s' %(type(b.__closure__[0])))
print ('b.__closure__[0].cell_contents=%s' %(b.__closure__[0].cell_contents))

Đầu ra

type(a) = <class 'function'>
a.__closure__ = <cell at 0x057F8490: int object at 0x68A65770>

type(a.__closure__[0]) = <class 'cell'>
a.__closure__[0].cell_contents = 9

type(b)=<class 'function'>
b.__closure__ = <cell at 0x0580BD50: int object at 0x68A65C80>

type(b.__closure__[0]) = <class 'cell'>
b.__closure__[0].cell_contents=90

Từ kết quả trên, chúng ta có thể thấy mỗi ô của các đối tượng vẫn giữ nguyên giá trị tại thời điểm tạo ra nó.