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的区别

  1. 在staticmethod下,first方法不能访问和修改类中的属性及方法,first方法对类的状态一无所知,而在classmethod下,second方法的第一个参数cls就是类本身,所以second方法通过cls可以访问和修改类的属性及方法.

什么情况下用staticmethod

  1. 当类方法中不涉及到类的属性和调用类的其他方法,该方法只作为类中的工具提供给其他方法使用

什么情况下用classmethod

  1. 当方法需要访问和修改类属性,以及返回类本身时

用法示例代码

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
本文总阅读量