Python面向对象高级编程:__slot__(给实例添加方法、属性)
纲要:
本章总的来说是给实例添加属性,给类添加方法两个主题,以及相应的作用范围。总结如下:
1.给实例添加属性(作用范围:当然是只对当前实例有效);
2.用__slots__限制可以给实例添加的属性(作用范围:__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的,除非在子类中也定义__slots__);
3.用types模块中的MethodType方法给实例添加方法;(作用范围:给“实例…”当然是限制于本实例);
4.给类添加方法;(作用范围:对所有实例生效)
以下是代码部分,逻辑较乱,但是都是上述四点的证据:

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 class Student(object): 4 __slots__ = ('name','age')#限制给类添加的属性 5 def set_score(self,score): 6 self.score = score 7 s = Student() 8 from types import MethodType 9 s.set_setscore = MethodType(set_score,s)#给实例添加方法 10 s.set_setscore(100) 11 print(s.score) 12 s.name = 'bolen' 13 s.age = 18 14 s.tt = 'test' #限制属性里只有name和score,所以此次会报错"has no attribute..." 15 print(s.name,s.age,s.tt) 16 s2 = Student() #给一个实例添加方法,对另一个实例是不起作用的 17 Student.set_score = set_score #为了给所有实例都添加方法,可以给类添加方法。 18 19 #使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的: 20 class GraduateStudent(Student): 21 pass 22 23 g = GraduateStudent() 24 g.tt = 9999 25 #除非在子类中也定义__slots__,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__。