83.类方法
staticmethod 官方文档
classmethod 官方文档
类方法是从属于
“类对象”的方法
。类方法通过装饰器
@classmethod
来定义,格式如下:
@classmethod
def 类方法名(cls [,形参列表]) :
函数体
# 可以理解为 无需实例化对象。就可以直接通过 类名.方法名() 来访问的方法
要点如下:
-
必须位于方法上面一行@classmethod
- 第一个
必须有;cls
指的就是cls
本身;(和“类对象”
指的是self
本身有异曲同工之处)实例对象
- 调用类方法格式
。 参数列表中,不需要也不能给:“类名.类方法名(参数列表)”
传 值。cls
- 类方法中
和访问实例属性
会导致实例方法
错误
-
时,传入子类继承父类方法
是子类对象,而cls
【操作】类方法使用测试非父类对象
# 类方法 从属于 类(模具)的 方法
class Student02:
company = '海贼王' # 类属性
@classmethod # 建立 实例对象之后 类(模具) 方法不会建立在 实例对象里面
def printCompany(cls):
print(cls.company)
Student02.printCompany()
静态方法
Python中允许定义与“类对象”无关的方法,称为“静态方法”。
静态方法”和在模块中定义普通函数没有区别,只不过“静态方法”放到了“类的名字空 间里面”,需要通过“类调用”。
静态方法通过装饰器
@staticmethod
来定义,
格式如下:
@staticmethod
def 静态方法名([形参列表]) :
函数体
要点如下:
-
必须位于方法上面一行@staticmethod
- 调用静态方法格式:“类名.静态方法名(参数列表)”。
- 静态方法中
和访问实例属性
会实例方法
导致错误
【操作】静态方法使用测试
class Student03:
company = '海贼王' # 类属性
def __init__(self, name, age):
self.name = name
self.age = age
@staticmethod
def add(a, b): # 静态方法
print(Student03.company) # 静态方法 里面 也可以调用 类属性
print('{0}+{1}={2}'.format(a, b, (a + b)))
return a + b # 类方法 和 静态方法中,不能调用 实例变量和实例方法
# 模具里 想吃饼干(实例对象和方法),不可以, 也就是 无法传递 self
Student03.add(20, 30)
区别
这两个方法的用法是类似的,在上面的例子中大多数情况下,
classmethod
也可以通过
staticmethod
代替,在通过类调用时,这两者对于调用者来说是不可区分的。
这两者的区别在于,增加了一个对
classmethod
的
实际调用类
,这带来了很多方便的地方:
引用
- 方法可以判断出自己是通过基类被调用,还是通过某个子类被调用
- 通过子类调用时,方法可以返回子类的实例而非基类的实例
- 通过子类调用时,方法可以调用子类的其他
classmethod
- 一般来说
可以完全替代classmethod
。staticmethod
staticmethod
唯一的好处是调用时它返回的是一个
真正的函数
,而且每次调用时
返回同一个实例
(
classmethod
则会对
基类
和
子类
返回不同的
bound method
实例),但这点几乎从来没有什么时候是有用的。
不过,可以在子类上被
staticmethod
,反之亦然 。
重写为classmethod