python:classmethod和staticmethod的区别和使用场景

引入

初学python面向对象,对classmethod和staticmethod的区别和使用场景进行简单总结。
注:两者的使用场景并不完善,只是记录自己用过的。

语法区别

声明时:

  • classmethod的第一个参数为类本身(cls),正如实例方法的第一个参数为对象本身(self);
  • staticmethod第一个参数不需要传入cls或self,故staticmethod中是无法访问类和对象的数据的。

调用时:

  • 都可用类名直接调用
  • 也可用实例对象调用(不推荐,没必要)

code如下:

class Test:
    @classmethod
    def f1(cls, info):
        print(info)

    @staticmethod
    def f2(info):
        print(info)
 
In [2]: Test.f1('hi')
hi

In [3]: Test.f2('hello')
hello

In [4]: t = Test()

In [5]: t.f1('hi')
hi

In [6]: t.f2('hello')
hello

In [7]: 

使用场景

两者特点:

  • classmethod可以设置修改类属性;也可以实例化对象;
  • staticmethod无法访问类或对象的数据,所以可把它当作一个辅助功能方法用,里面包含一些与该类有关的逻辑代码。比如validate(*args)

实例1

需求:从本地文件中(txt, csv, json等等)读取数据,生成一个对象。比如,本地有一个data.json文件,里面包含了每个学生的姓名及对应的考试成绩。现在要求读取该数据,生成一个class对象。

思路:

  • __init__方法中,清晰的声明对象的属性
  • 用一个classmethod:load_json,专门用于读取data_file,获取数据,实例化对象
  • 用一个staticmethod:validate,来对要初始化数据进行有效性检查

代码:

class Class:
    def __init__(self, names, grades):
        self._names = names
        self._grades = grades

    @classmethod
    def load_json(cls, data_file):
        # 读取数据,获得names,grades
        cls.validate(names,grades)
        return cls(names, grades)

    @staticmethod
    def validate(names, grades):
        # 检查数据有效性
        pass

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章