python 限制绑定(__slots__)与动态绑定MethodType
(一)Methodtype(基于实例的动态绑定)
1 class Student: 2 pass 3 def set_name(self, name): 4 self.name = name 5 6 s1 = Student() 7 s2 = Student() 8 s3 = Student() 9 #----start 将方法绑定在类实例上 10 # s1.set_name = MethodType(set_name,s1,Student) #py2是三个参数 11 # s2.set_name = MethodType(set_name,s2,Student) 12 s1.set_name = MethodType(set_name,s1) #py3是两个参数 13 s2.set_name = MethodType(set_name,s2) 14 #-----end 将方法绑定在类实例上 15 s1.set_name('tom') 16 s2.set_name('tony') 17 print(s1.name,s2.name,) #tom tony 18 print(s3.name) #报错,因为那个s3对象并没有设置绑定(注意,对象是独立)
(一)Methodtype(基于类的动态绑定)
1 #coding: utf8 2 from types import MethodType 3 """ 4 :::::::::::::::动态绑定::::::: 5 MethodType: 6 用MethodType将方法绑定到类,并不是将这个方法直接写到类内部, 7 而是在内存中创建一个link指向外部的方法,在创建实例的时候这个link也会被复制 8 """ 9 class Student: 10 pass 11 def set_name(self, name): 12 self.name = name 13 s1 = Student() 14 s2 = Student() 15 s3 = Student() 16 s31 = Student() 17 #将set_name方法绑定到类上 18 Student.set_name = MethodType(set_name,Student) 19 s1.set_name('tom') 20 s2.set_name('tony') 21 22 print(s1.name,s3.name,s31.name)#('tony', 'tony', 'tony') 23 print("1111111111111111111111111")
(二) __slots__限制绑定
1 class Foo: 2 """:::::::::::::::__slots__限制绑定::::::::::::::""" 3 __slots__ = ['x','y','name'] #严格按这的定义 4 def __init__(self,name): 5 self.name = name 6 7 f = Foo('pite') 8 f.x = 10 9 # print(f.__dict__) #如果一个对象所属类里有定义__slots,那么此对象没收有__dict__属性 10 print(f.x) 11 f1 = Foo('tier') 12 f1.x = 100 13 f1.y = 200 14 print(f1.x,f1.y) 15 print(Foo.__dict__)#这个类就有__dict__