Python面向对象高级编程:__slot__(给实例添加方法、属性)

时间:2023-03-08 18:04:34

纲要:

本章总的来说是给实例添加属性,给类添加方法两个主题,以及相应的作用范围。总结如下:

1.给实例添加属性(作用范围:当然是只对当前实例有效);

2.用__slots__限制可以给实例添加的属性(作用范围:__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的,除非在子类中也定义__slots__);

3.用types模块中的MethodType方法给实例添加方法;(作用范围:给“实例…”当然是限制于本实例);

4.给类添加方法;(作用范围:对所有实例生效)

以下是代码部分,逻辑较乱,但是都是上述四点的证据:

Python面向对象高级编程:__slot__(给实例添加方法、属性)Python面向对象高级编程:__slot__(给实例添加方法、属性)
  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__。

Python3中的__slots__