前言

Python中每次调用类的方法都会把实例化后的对象作为第一个参数传入进去,即常见的self参数。那有没有办法在不实例化的情况下调用类的方法呢?有的。

classmethodstaticmethod这两个装饰器都可以使得类中的方法在不经过类实例化的情况下可以执行。不同的是classmethod输入的第一个参数是class对象本身,而不是一般的方法情况下的类型实例。即第一个参数为class而不是instance。而staticmethod使得一个方法无论是利用类来调用它,还是实例化后调用它。都没有这个第一个默认的输入参数。这使得staticmethod的使用起来非常像一个不在类定义中的普通函数。

下面来看一个不是非常恰当的例子:

class Foo(object):
    def print_instance(self):
        print("Instance: %s" % self)
    
    @classmethod
    def print_class(cls):
        print("Class: %s" % cls)

    @staticmethod
    def print_args(*args):
        print("Args: %s" % args)

    def print_no_self():
        print("I don't have self input.")

这里的四个方法中print_instance()是一般方法,print_classclassmethod装饰的方法,print_argsstaticmethod装饰的方法。

通过classmethod装饰后的方法就可以不经过实例化直接调用,就像这样:

In [40]: Foo.print_class()
Class: <class '__main__.Foo'>