Python语言学习:@staticmethod 与 @classmethod
python 里的静态方法(@staticmethod)与类方法(@classmethod)
个人理解
- 大多时候:二者可以做同样的事情,达到同样的目的
- 不过,
classmethod
偏向于与类中的方法,互相调用;所以 会有(cls,…args)
这种参数约定 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.方法名() 」
或「 类名.方法名() 」
去调用静态方法和类方法; - 如果需要调用普通方法,需要先实例化一个对象,然后利用对象去调用普通方法
- 第一个参数
- 静态方法和类方法 是针对类定义的,除了可以使用类名去调用,也可以使用实例对象去调用,但是不建议
最后
- 一般来说,如果方法内部涉及到实例对象属性的操作,建议用普通方法;
- 如果方法内部没有操作实例属性的操作,仅仅包含一些工具性的操作,建议使用静态方法;
- 而如果需要对类属性,即静态变量进行限制性操作,则建议使用类方法