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__。
Python3中的__slots__
原文地址:https://www.cnblogs.com/bolenzhang/p/7077977.html