Python - Dynamic Binding

Trong object-oriented programming , khái niệm dynamic binding có mối liên hệ chặt chẽ với tính đa hình. Trong Python, liên kết động là quá trình giải quyết một phương thức hoặc thuộc tính tại thời điểm chạy, thay vì tại thời điểm biên dịch.

Theo tính năng polymorphism , các đối tượng khác nhau phản ứng khác nhau với cùng một lệnh gọi phương thức dựa trên các triển khai của chúng. Hành vi này được đạt được thông qua method overriding , nơi một lớp con cung cấp triển khai của nó cho một method được định nghĩa trong lớp cha của nó.

Python interpreter xác định phương pháp hoặc attribute nào là phù hợp để gọi dựa trên loại hoặc phân cấp lớp của đối tượng tại thời điểm thực thi. Điều này có nghĩa là phương pháp hoặc thuộc tính cụ thể sẽ được gọi được xác định một cách động, dựa trên loại thực tế của đối tượng.

Example

Ví dụ sau minh họa việc gán động trong Python −

class shape:
   def draw(self):
      print ("draw method")
      return

class circle(shape):
   def draw(self):
      print ("Draw a circle")
      return

class rectangle(shape):
   def draw(self):
      print ("Draw a rectangle")
      return

shapes = [circle(), rectangle()]
for shp in shapes:
   shp.draw()

Nó sẽ tạo ra output

Draw a circle
Draw a rectangle

Như bạn có thể thấy, phương thức draw() được liên kết động với triển khai tương ứng dựa trên loại của đối tượng. Đây là cách mà liên kết động được thực hiện trong Python.

Duck Typing

Một khái niệm liên quan chặt chẽ đến việc liên kết động là duck typing . Việc một đối tượng có phù hợp cho một mục đích cụ thể hay không được xác định bởi sự hiện diện của một số phương thức hoặc thuộc tính nhất định, thay vì loại của nó. Điều này cho phép linh hoạt hơn và tái sử dụng mã trong Python.

Duck typing là một tính năng quan trọng của các ngôn ngữ lập trình kiểu động như Python ( Perl , Ruby , PHP , Javascript , v.v.) mà tập trung vào hành vi của một đối tượng hơn là kiểu cụ thể của nó. Theo khái niệm "duck typing", "Nếu nó đi như một con vịt và kêu như một con vịt, thì nó phải là một con vịt."

Duck typing cho phép các đối tượng của các loại khác nhau có thể được sử dụng thay thế cho nhau miễn là chúng có các phương thức hoặc thuộc tính cần thiết. Mục tiêu là thúc đẩy tính linh hoạt và tái sử dụng mã. Đây là một khái niệm rộng hơn, nhấn mạnh vào hành vi và giao diện của đối tượng thay vì các loại chính thức.

Dưới đây là một ví dụ về duck typing −

class circle:
   def draw(self):
      print ("Draw a circle")
      return

class rectangle:
   def draw(self):
      print ("Draw a rectangle")
      return

class area:
   def area(self):
      print ("calculate area")
      return

def duck_function(obj):
   obj.draw()

objects = [circle(), rectangle(), area()]
for obj in objects:
   duck_function(obj)

Nó sẽ tạo ra output

Draw a circle
Draw a rectangle
Traceback (most recent call last):
 File "C:\Python311\hello.py", line 21, in <module>
  duck_function(obj)
 File "C:\Python311\hello.py", line 17, in duck_function
 obj.draw()
AttributeError: 'area' object has no attribute 'draw'

Ý tưởng quan trọng nhất đằng sau duck typing duck_function() không quan tâm đến các loại đối tượng cụ thể mà nó nhận được. Nó chỉ yêu cầu các đối tượng phải có một phương thức draw() . Nếu một đối tượng "kêu như vịt" bằng cách có hành vi cần thiết, nó sẽ được coi là một "vịt" với mục đích gọi phương thức draw() .

Do đó, trong kiểu lập trình duck typing, trọng tâm là hành vi của đối tượng hơn là kiểu rõ ràng của nó, cho phép các loại đối tượng khác nhau được sử dụng thay thế cho nhau miễn là chúng thể hiện hành vi cần thiết.