资讯专栏INFORMATION COLUMN

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

baoxl / 3367人阅读

摘要:然而,作为学生代表的我,绝对不允许老师混入进来充当间谍。而且,该方法由所独享,并不需要判断是否为学生。由此,改进为以下版本。得到如下测试代码而对于教学分类的判断,则有以下两种情形。

前言

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

设计

好了,最直观的映入大脑的就是三个实体:
教师学生
这三个实体分别有对应的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
结束

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37639.html

相关文章

  • classmethod&staticmethod 以及 __slots__

    摘要:什么是中的它的用途是什么装饰器对应的函数不需要实例化,不需要参数,但第一个参数需要是表示自身类的参数,可以来调用类的属性,类的方法,实例化对象等。 什么是python中的classmethod,它的用途是什么? classmethod装饰器对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。 cl...

    newsning 评论0 收藏0
  • 90 % 的 Python 开发者不知道的描述符应用

    摘要:由上面的注释,可以看出其实就相当于一个描述符类,而在此刻变成了一个描述符。调用这个方法可以知道,每调用一次,它都会经过描述符类的。基于描述符如何实现同样的也是一样。我想你应该对描述符在中的应用有了更深的理解。好吧,我承认我标题党了。但是这篇文章的知识点,你有极大的可能并不知道。 前段时间,我写了一篇描述符的入门级文章,从那些文章里你知道了如何定义描述符,且明白了描述符是如何工作的。 如果你还...

    番茄西红柿 评论0 收藏0
  • 90 % 的 Python 开发者不知道的描述符应用

    摘要:由上面的注释,可以看出其实就相当于一个描述符类,而在此刻变成了一个描述符。调用这个方法可以知道,每调用一次,它都会经过描述符类的。基于描述符如何实现同样的也是一样。我想你应该对描述符在中的应用有了更深的理解。好吧,我承认我标题党了。但是这篇文章的知识点,你有极大的可能并不知道。 前段时间,我写了一篇描述符的入门级文章,从那些文章里你知道了如何定义描述符,且明白了描述符是如何工作的。 如果你还...

    0x584a 评论0 收藏0
  • python classmethod 与 staticmethod 小谈

    摘要:而类的实例并不会影响类的静态变量,只是会修改对象实例本身的值,所以后面两个的结果总是同样,如果我们使用和结果也将仅仅是静态变量变化后的结果,与类的实例无关以上是对和的暂时做的了解的总结,如有纰漏,请及时指正 概念 python 的classmethod 与staticmethod 这两个有什么区别? 二者又有什么联系?在google和baidu之后, 得到的大致的联系就是二者都是对类的...

    keke 评论0 收藏0
  • python装饰器、描述符模拟源码实现

    摘要:如果对象定义和,则它被认为是数据描述符。属性查找优先级为类属性数据描述符实例属性非数据描述符默认为内部是用实现的,这里用模拟实现功能代码参考官方文档原理代码实现原理代码实现原理参考资料,知乎如何理解装饰器, 概要 本人python理论知识远达不到传授级别,写文章主要目的是自我总结,并不能照顾所有人,请见谅,文章结尾贴有相关链接可以作为补充 全文分为三个部分装饰器理论知识、装饰器应用、装...

    Luosunce 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<