什么是绑定
(这个绑定不是骨骼绑定里的绑定) 把一个方法或者属性和类或者对象关联起来,被称为绑定
1)静态绑定: 在程序运行前写好的属性和方法
2)动态绑定: 在程序运行后添加的属性和方法(一般只要不在类里面实现定义好的都属于动态绑定) 操作对象:对象 功能说明:通过对象,往对象内部添加新的属性和方法 (只对当前对象起作用,对其他对象和类不会造成影响) 操作对象:类 功能说明:在类外,为类添加新的属性和方法 (会对所有的对象造成影响,包括类和派生类)
绑定的特点: 可以在程序执行时(非编译期)修改对象或者类的属性和方法 (小知识:Python不叫编译期间叫解释期间,C++那类语言才叫编译)
注意:
因为动态绑定对类进行修改,不仅对自己产生影响, 而且会对所有的对象,派生类都会产生影响, 对代码可读性也会造成影响。(能不用还是不用) 除非万不得已,否则尽量避免使用动态绑定
对象绑定
属性绑定
案例1:绑定一个新的属性
class ClassA(object): # 创建一个空的类
pass
obj = ClassA() # 创建一个对象obj
obj.var = "New var" # 给对象新添加一个属性(静态绑定)
print(obj.var) # 访问刚刚创建的属性
# 输出
#===============================
New var
方法绑定:MethodType()
方法绑定需要借助一个方法,MethodType( ) 这个方法是一个高阶函数
```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
# 并创建一个新属性 obj.func 并把函数传递对象
# 此时obj.func是obj的新方法
print(obj.func()) # 访问新方法
```python
# 输出
#===============================
New var
None
类绑定
和绑定对象是一样的
绑定属性
class ClassA(object): # 创建一个空的类
pass
ClassA.var = "New var" # 给类新添加一个属性(静态绑定)
obj = ClassA( ) # 创建一个新对象
print(obj.var) # 访问类中的新属性
# 输出
#===============================
New var
绑定方法
```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
# 并创建一个新属性 ClassA.func 并把函数传递给类
# 此时ClassA.func是ClassA的新方法
print(obj.func()) # 访问新方法
```python
# 输出
#===============================
New var
None
绑定限制:slots
如果我们不希望用户给类随便添加属性和方法, 可以使用slots属性限制 用户只可以使用solots里储存的名称,solots可以是元组或者列表,但名称一定是字符串 如果用户尝试使用solots外储存的名称,会引发AttributeError异常
```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)
```python
# 输出
#===============================
10
AttributeError: 'ClassName' object has no attribute 'var2'