什么是绑定

(这个绑定不是骨骼绑定里的绑定) 把一个方法或者属性和类或者对象关联起来,被称为绑定

1)静态绑定: 在程序运行前写好的属性和方法

2)动态绑定: 在程序运行后添加的属性和方法(一般只要不在类里面实现定义好的都属于动态绑定) 操作对象:对象 功能说明:通过对象,往对象内部添加新的属性和方法 (只对当前对象起作用,对其他对象和类不会造成影响) 操作对象:类 功能说明:在类外,为类添加新的属性和方法 (会对所有的对象造成影响,包括类和派生类)

绑定的特点: 可以在程序执行时(非编译期)修改对象或者类的属性和方法 (小知识:Python不叫编译期间叫解释期间,C++那类语言才叫编译)

注意:
因为动态绑定对类进行修改,不仅对自己产生影响, 而且会对所有的对象,派生类都会产生影响, 对代码可读性也会造成影响。(能不用还是不用) 除非万不得已,否则尽量避免使用动态绑定

对象绑定

属性绑定

案例1:绑定一个新的属性

  1. class ClassA(object): # 创建一个空的类
  2. pass
  3. obj = ClassA() # 创建一个对象obj
  4. obj.var = "New var" # 给对象新添加一个属性(静态绑定)
  5. print(obj.var) # 访问刚刚创建的属性
  1. # 输出
  2. #===============================
  3. New var

方法绑定:MethodType()

方法绑定需要借助一个方法,MethodType( ) 这个方法是一个高阶函数

L- 动态绑定 - 图1```python from types import MethodType # 绑定需要用到的模块和方法 class ClassA(object): # 创建一个空的类 pass

obj = ClassA()
obj.var = “New var”

def func(self): # 新建一个函数,准备绑定给对象 print(self.var) return None

obj.func = MethodType(func, obj) # 把函数func传递给属性obj

  1. # 并创建一个新属性 obj.func 并把函数传递对象
  2. # 此时obj.func是obj的新方法

print(obj.func()) # 访问新方法

  1. ```python
  2. # 输出
  3. #===============================
  4. New var
  5. None

类绑定

和绑定对象是一样的

绑定属性

  1. class ClassA(object): # 创建一个空的类
  2. pass
  3. ClassA.var = "New var" # 给类新添加一个属性(静态绑定)
  4. obj = ClassA( ) # 创建一个新对象
  5. print(obj.var) # 访问类中的新属性
  1. # 输出
  2. #===============================
  3. New var

绑定方法

L- 动态绑定 - 图2```python from types import MethodType # 绑定需要用到的模块和方法 class ClassA(object): # 创建一个空的类 pass

ClassA.var = “New var”
obj = ClassA( )

def func(self): # 新建一个函数,准备绑定给对象 print(self.var) return None

ClassA.func = MethodType(func, ClassA) # 把函数func传递给类ClassA

  1. # 并创建一个新属性 ClassA.func 并把函数传递给类
  2. # 此时ClassA.func是ClassA的新方法

print(obj.func()) # 访问新方法

  1. ```python
  2. # 输出
  3. #===============================
  4. New var
  5. None

绑定限制:slots

如果我们不希望用户给类随便添加属性和方法, 可以使用slots属性限制 用户只可以使用solots里储存的名称,solots可以是元组或者列表,但名称一定是字符串 如果用户尝试使用solots外储存的名称,会引发AttributeError异常

L- 动态绑定 - 图3```python class ClassName(object): slots = (“var”)

obj = ClassName()

obj.var = 10 # 绑定一个solots有储存的一个名称 print(obj.var)

try: obj.var2 = 20 # 尝试 绑定一个solots没有储存的名称 except AttributeError as e: print(“AttributeError:”,e)

  1. ```python
  2. # 输出
  3. #===============================
  4. 10
  5. AttributeError: 'ClassName' object has no attribute 'var2'