Python语言学习:@staticmethod 与 @classmethod

python 里的静态方法(@staticmethod)与类方法(@classmethod)
更新于: 2022-02-11 06:15:25

个人理解

  1. 大多时候:二者可以做同样的事情,达到同样的目的
  2. 不过,classmethod 偏向于与类中的方法,互相调用;所以 会有(cls,…args)这种参数约定
  3. staticmethod 倾向于是一个游离的函数,与类其实没有必然联系,参数中没有  self/cls 这种与类有关的东西

先看实例

class A:

    @staticmethod
    def m1()
        pass

    @staticmethod
    def m2():
        A.m1() # bad

    @classmethod
    def m3(cls):
        cls.m1() # good

其它实例

# Python program to demonstrate
# use of class method and static method.
from datetime import date

class Person:
	def __init__(self, name, age):
		self.name = name
		self.age = age
	
	# a class method to create a Person object by birth year.
	@classmethod
	def fromBirthYear(cls, name, year):
		return cls(name, date.today().year - year)
	
	# a static method to check if a Person is adult or not.
	@staticmethod
	def isAdult(age):
		return age > 18

person1 = Person('mayank', 21)
person2 = Person.fromBirthYear('mayank', 1996)

print (person1.age)
print (person2.age)

# print the result
print (Person.isAdult(22))

区别

下面总结一下普通方法、静态方法、类方法的区别

  • 普通方法
    • 第一个参数 self 代表实例对象本身,可以使用 self 直接引用定义的实例属性和普通方法;
    • 如果需要调用静态方法和类方法,通过「 类名.方法名() 」调用即可
  • 静态方法
    • 使用「 类名.静态变量 」引用静态变量,利用「 类名.方法名() 」调用其他静态方法和类方法;
    • 如果需要调用普通方法,需要先实例化一个对象,然后利用对象去调用普通方法
  • 类方法
    • 第一个参数 cls 代表类本身(等价),通过「 cls.静态变量 」「 类名.静态变量 」引用静态变量,利用「 cls.方法名() 」「 类名.方法名() 」去调用静态方法和类方法;
    • 如果需要调用普通方法,需要先实例化一个对象,然后利用对象去调用普通方法
  • 静态方法和类方法 是针对类定义的,除了可以使用类名去调用,也可以使用实例对象去调用,但是不建议

最后

  • 一般来说,如果方法内部涉及到实例对象属性的操作,建议用普通方法;
  • 如果方法内部没有操作实例属性的操作,仅仅包含一些工具性的操作,建议使用静态方法;
  • 而如果需要对类属性,即静态变量进行限制性操作,则建议使用类方法

参考