动态绑定实例属性和实例方法、动态绑定限制
1 静态语言和动态语言
Python是动态语言,可以给实例进行动态绑定属性和方法;Java是静态语言,不能给实例进行动态绑定属性和方法
动态绑定的属性和方法只有相应的实例可以使用;如果要想实现所有的实例都能够使用的实例和方法就必须在类中绑定类属性和类方法
2 动态绑定限制
实例属性可以随便添加,但是我们可以利用特殊的__slots__变量,来限制该class实例能添加的属性;
注意:__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的,除非在子类中也定义__slots__,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__。
class 类名(object):
__slots__ = ('允许绑定的属性名1', '允许绑定的属性名2')
3 动态绑定方法
注意:动态绑定实例方法时会自动添加一个形参self,所以在要进行动态绑定的方法中至少要有一个形参
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Date : 2017-05-22 10:07:27 4 # @Author : Your Name (you@example.org) 5 # @Link : http://example.org 6 # @Version : $Id$ 7 8 import os 9 10 class Person(object): 11 __slots__ = ('name', 'age', 'run') # 限制实例只能动态绑定name、age这两个属性 12 13 def run(self): # 因为实例方法和类方法在创建的时候都会自动添加一个self形参, 14 #所以在定义要添加的方法时要添加一个形参 15 print("Person can run.") 16 17 def test(): 18 p1 = Person() 19 p1.name = 'warrior' # 给实例p1动态绑定实例属性 20 print(p1.name) 21 # p1.gender = 'f' # 动态绑定失败;因为在class中有绑定限制 22 23 from types import MethodType 24 p1.run = MethodType(run, p1) # 动态绑定实例方法时会自动添加一个形参self 25 p1.run() 26 27 print("==================") 28 p2 = Person() 29 # print(p2.name) # 实例p2没有name属性,所以本行程序执行时会报错 30 31 if __name__ == '__main__': 32 test()
浙公网安备 33010602011771号