把类函数当作类的一个方法返回。类方法第一个参数是指明类,跟类中函数一样,第一个参数是指明类实例。类方法修饰符采用下面的格式来使用:
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
时间: 2024-11-04 15:49:21