Python class类@staticmethod及@classmethod区别浅析
作者:xxxxxxxx
这篇文章主要为大家介绍了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
以上就是Python class类@staticmethod及@classmethod区别浅析的详细内容,更多关于Python staticmethod classmethod的资料请关注脚本之家其它相关文章!