前言
一般的实例化方法,必须实例化类之后才能被调用,Python 不会自动为第一个参数 self 绑定调用者,因此实例方法的调用者是类本身,而不是对象,需要传入参数值,如下代码没有传入参数值则会报错:
TypeError: func1() missing 1 required positional argument: 'self'
class Y(object):
def func1(self):
print("func1")
Y.func1()
# Y.func1('Yy_Rose')
而 staticmethod 和 classmethod 可以不需要实例化,直接 类名.方法名( ) 来调用,也可以不实例化调用该方法 类名.方法名( ),它们的参数是可以直接被调用的。
classmethod
classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等:
# 样式
class Y(object):
@classmethod
def f(cls,arg1, arg2, ...):
...
class Y(object):
class_type = '类属性'
def func1(self):
print("func1")
print(self)
# 类方法(不需要实例化类就可以被类本身调用)
@classmethod
def func2(cls):
print("func2")
# cls:表示没被实例化的类本身
print(cls)
print(cls.class_type)
# 调用类方法
cls().func1()
Y.func1('Yy_Rose')
'''
输出结果:
func1
Yy_Rose
'''
Y().func2()
'''
输出结果:
func2
<class '__main__.Y'>
类属性
func1
<__main__.Y object at 0x000001D38A421BE0>
'''
staticmethod
staticmethod 函数返回函数的静态方法,该方法不强制要求传递参数:
# 样式
class Y(object):
@staticmethod
def f(arg1, arg2, ...):
...
class Y(object):
# 静态方法
@staticmethod
def f():
print('Yy_Rose')
Y.f() # 静态方法无需实例化
cobj = Y()
cobj.f() # 也可以实例化后调用
'''
输出结果:
Yy_Rose
Yy_Rose
'''
staticmethod 函数的参数要求为可调用的,所以类也是可以的:
class Class1(object):
@staticmethod
class Class2(object):
def __init__(self, val):
self.val = val
def blogger(self):
print(f"您正在浏览的博主是: {self.val} ~")
inv = Class1.Class2('Yy_Rose')
inv.blogger() # 输出 : 您正在浏览的博主是: Yy_Rose ~
总结
@staticmethod 函数不需要表示自身对象的 self 和自身类的 cls 参数,就跟使用函数一样,只不过是在类中定义的函数,它是可调用的,无需先实例化类,它的定义通过继承是不可变的。
@classmethod 函数也不需要 self 参数,也可以在不实例化类的情况下调用,但它的定义通过继承遵循子类,而不是父类,这是因为函数的第一个参数必须始终是表示自身类的 cls 参数。
@staticmethod 和 @classmethod 的区别:Stack Overflow
@staticmethod 和 @classmethod 的用途: 知乎