引入
初学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