Python中@staticmethod和@classmethod的区别
平时在写Python代码的过程中,经常性的会用到@staticmethod和@classmethod这两个装饰器,但是却不能真正搞明白他们之间的区别,也没搞明白他们的实用场景;这篇文章看看能不能探个究竟.
如下代码分别使用@staticmethod和classmethod
class Base:
@staticmethod
def first(key):
print(key)
@classmethod
def second(cls, key):
print(key)
if __name__ == '__main__':
b = Base()
b.first(1)
b.second(2)
Base.first(1)
Base.second(2)
执行它的结果:
1
2
1
2
从结果中看出,无论是staticmethod还是classmethod,都可以从类的实例和类对象中调用.
staticmethod和classmethod的区别
- 在staticmethod下,first方法不能访问和修改类中的属性及方法,first方法对类的状态一无所知,而在classmethod下,second方法的第一个参数cls就是类本身,所以second方法通过cls可以访问和修改类的属性及方法.
什么情况下用staticmethod
- 当类方法中不涉及到类的属性和调用类的其他方法,该方法只作为类中的工具提供给其他方法使用
什么情况下用classmethod
- 当方法需要访问和修改类属性,以及返回类本身时
用法示例代码
from datetime import date
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
# 通过出生年计算年龄
@classmethod
def age_from_year(cls, name, year):
return cls(name, date.today().year - year)
# 是否已经老了,假设大于3年就是老狗
@staticmethod
def is_old(age):
if age > 3:
return "老狗了"
return "小奶狗"
dog1 = Dog('kelly', 5)
dog2 = Dog.age_from_year('tedi', 2022)
print(dog1.age)
print(dog2.age)
print(Dog.is_old(10))
输出结果
5
1
True