Python标准库:内置函数classmethod(function)


把类函数当作类的一个方法返回。类方法第一个参数是指明类,跟类中函数一样,第一个参数是指明类实例。类方法修饰符采用下面的格式来使用:

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


评论关闭