转载

浅聊Python class中的@staticmethod以及@classmethod

前言

入学不久之后,我就在思考,对于学校的这么多人,这么多教师,这么多学生,以及其他种种事物,能否对应的做一套"系统"下来呢?随之也跟着思考了起来。

设计

好了,最直观的映入大脑的就是三个实体:

人、 教师学生

这三个实体分别有对应的feature属性以表示其为人/教师/学生。

由此,得到以下三个class。

class Person():  FEATURE = 'P'   def __init__(self):   pass class Teacher(Person):  FEATURE = 'T'  def __init__(self):   pass class Student(Person):  FEATURE = 'S'   def __init__(self):   pass 

然而,作为学生代表的我,绝对不允许老师混入进来充当间谍。所以,必须给学生类提供一个方法以判断是否为学生。那么,对于这个方法,仅需要从Student类去调用即可,并非一定需要实例化的对象。而且,该方法由Student所独享,Teacher并不需要判断是否为学生。由此,Student改进为以下版本。

class Student(Person): FEATURE = 'S'  def __init__(self):  pass @staticmethod def is_student(obj):  if obj.FEATURE == 'S':      return True  else:   return False 

正在思考的时候,一位代课老师过来看到了我的大概设计,然后说,“同学啊,你介个设计呢,对于我们老师,少了点东西,作为老师,我们有分文理,文理之后还有数学...blah..blah..”。然后我就走神了,对啊,老师还根据教学科目分文理呢,有数学老师,有音乐老师,有...

class MathTeacher(Teacher):  TEACHING = 'MATH'  def __init__(self):   pass class DrawingTeacher(Teacher):  TEACHING = 'DRAWING'  def __init__(self):   pass    

所以以上为代表的两个类就诞生了。至于对于文理的判断,短暂的思考之后,决定把该功能添加到Teacher类做以判断。

class Teacher(Person): FEATURE = 'T' def __init__(self):  pass @classmethod def category(cls):  science_cate = ['MATH']  arts_cate = ['DRAWING', 'PAINTING']  teaching = getattr(cls, 'TEACHING', None)  if teaching in science_cate:   return 'Science'  elif teaching in arts_cate:   return 'Arts'  else:   return 'Unknow' 

测试

在完成以上初步构想之后,决定测试一下所写代码是否能按预期执行。得到如下测试代码

p = Person() t = Teacher() s = Student()  print(Student.is_student(p))    #False print(Student.is_student(t))    #False print(Student.is_student(s))    #True

而对于教学分类的判断,则有以下两种情形。

  • 判断某个教师 属于哪个教学分类

print(DrawingTeacher.category())    #Arts print(MathTeacher.category())       #Science print(Teacher.category())           #Unknow
  • 判断某个教师 实例 属于哪个教学分类

teacher_wang = DrawingTeacher() teacher_li = MathTeacher() teacher = Teacher()  print(teacher_wang.category())    #Arts print(teacher_li.category())      #Science print(teacher.category())         #Unknow

结束

到此时,再回过头一看,噗,什么狗屁设计。

正文到此结束
Loading...