Python - 动态绑定


在面向对象编程中,动态绑定的概念与多态性密切相关。在Python中,动态绑定是在运行时而不是在编译时解析方法或属性的过程。

根据多态性特征,不同的对象根据其各自的实现对相同的方法调用做出不同的响应。此Behave是通过方法重写实现的,其中子类提供其超类中定义的方法的自己的实现。

Python 解释器在运行时根据对象的类型或类层次结构确定要调用的适当方法或属性。这意味着要调用的具体方法或属性是根据对象的实际类型动态确定的。

例子

以下示例说明了 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()

它将产生以下输出-

Draw a circle
Draw a rectangle

正如您所看到的,draw() 方法根据对象的类型动态绑定到相应的实现。这就是Python中动态绑定的实现方式。

鸭子打字

与动态绑定密切相关的另一个概念是鸭子类型。一个对象是否适合特定用途是由某些方法或属性的存在决定的,而不是由其类型决定的。这使得 Python 具有更大的灵活性和代码重用性。

鸭子类型是 Python(Perl、Ruby、PHP、Javascript 等)等动态类型语言的一个重要功能,它专注于对象的Behave而不是其特定类型。根据“鸭子类型”的概念,“如果它走路像鸭子,嘎嘎叫像鸭子,那么它一定是鸭子。”

鸭子类型允许不同类型的对象互换使用,只要它们具有所需的方法或属性。目标是提高灵活性和代码重用。它是一个更广泛的概念,强调对象Behave和接口而不是形式类型。

这是鸭子打字的一个例子 -

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)

它将产生以下输出-

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'

鸭子类型背后最重要的想法是,duck_function() 不关心它接收的对象的特定类型。它只要求对象有一个draw()方法。如果一个对象通过具有必要的Behave而“像鸭子一样嘎嘎叫”,则在调用 draw() 方法时,它将被视为“鸭子”。

因此,在鸭子类型中,重点是对象的Behave而不是其显式类型,允许不同类型的对象互换使用,只要它们表现出所需的Behave。