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__
slots限制绑定

 

posted @ 2017-04-25 20:20  福临  阅读(135)  评论(0编辑  收藏  举报