python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python staticmethod classmethod

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的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文