淺聊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改進爲如下版本。code

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類作以判斷。ci

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'

測試

在完成以上初步構想以後,決定測試一下所寫代碼是否能按預期執行。
獲得以下測試代碼get

p = Person()
t = Teacher()
s = Student()

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

而對於教學分類的判斷,則有如下兩種情形。數學

  • 判斷某個教師 屬於哪一個教學分類it

print(DrawingTeacher.category())    #Arts
print(MathTeacher.category())       #Science
print(Teacher.category())           #Unknow
  • 判斷某個教師 實例 屬於哪一個教學分類class

teacher_wang = DrawingTeacher()
teacher_li = MathTeacher()
teacher = Teacher()

print(teacher_wang.category())    #Arts
print(teacher_li.category())      #Science
print(teacher.category())         #Unknow

結束

到此時,再回過頭一看,噗,什麼狗屁設計。方法

相關文章
相關標籤/搜索