把类函数当作类的一个方法返回。
类方法第一个參数是指明类,跟类中函数一样,第一个參数是指明类实例。
类方法修饰符採用以下的格式来使用:
class C:
@classmethod
def f(cls, arg1, arg2, ...):
...
从上面格式来看,@classmethod是函数在前置的一个修饰符。能够查看语言參考手冊。
经过类方法修饰符的函数,能够直接通过类来调用,比方C.f()方式。也能够通实例的方式来调用,比方C().f()方式,但这个实例在这个函数里被忽略掉了,没起到什么作用。
假设类方法修饰符的函数,在继承类时,派生类作为第一个參数传递给这个函数,也就是cls等于派生类。
类方法修饰符定义的函数与C++或JAVA里静态函数是不一样的,假设要类似的功能。须要使用另外一个修饰符staticmethod。
classmethod设计的目的是什么呢?事实上与Python面向对象编程有关的,由于Python不支持多个的參数重载构造函数,比方在C++里,构造函数能够依据參数个数不一样。能够写多个构造函数。Python为了解决问题,採用classmethod修饰符的方式,这样定义出来的函数就能够在类对象实例化之前调用这些函数,就相当于多个构造函数,解决多个构造函数的代码写在类外面的问题。
与修饰符staticmethod的差别是类方法有一个类型參数,而静态方法没有。静态方法主要用来解决全局函数的作用域的问题,而类方法是解决多个构造函数的问题。因此应用场境不一样。
样例:
#classmethod() class C: def __init__(self, i): print('__init__: %d' % i) @classmethod def f(cls, name): print(name) return C(int(name)) a = C(1) b = C.f('10') c = C(2).f('100') class D(C): pass D.f('20')
输出结果例如以下:
__init__: 1
10
__init__: 10
__init__: 2
100
__init__: 100
20
__init__: 20