33. 静态方法、类方法和成员方法有什么区别

静态方法和类方法功能接近,类方法是加上一个cls作为类的引用,这样可以通过cls来访问类的变量, 也可以作为类名来调用其构造函数,他们均不能访问类的实例中的变量。

  • 静态方法,主要处理与这个类的逻辑关联,和c++中的静态方法相似。

  • 类方法(@classmethod), 关注于从类中调用方法, 而不是在实例中调用方法, 定义时需要传递cls; 例如下面定义静态方法和类方法::

    class C:
        @staticmethod
        def f(arg1, arg2, ...):
            ...
    
        @classmethod
        def f(cls, arg1, arg2, ...):
            ...
    
  • 成员函数: 实例的方法, 只能通过实例进行调用;

例如::

class Book:
    version = "1.0"

    def __init__(self, name):
        self.name = name

    def fn1(self):
        print("call fn1 %s %s" % (Book.version, self.name));

    #仅在Book名字空间之下
    def fn2():
        print("call fn2 %s" % Book.version);


    @staticmethod
    def fn3():
        print("call fn3 static method %s" % Book.version);


    @classmethod
    def fn4(cls):
        print("call fn4 class method %s %s" % (Book.version, cls.version));


#Book.fn1()     #成员函数在没有对象时不能调用
Book.fn2()
Book.fn3()
Book.fn4()

book = Book("openwrt")
book.fn1()
#book.fn2()     #传递了对象,但实际上函数不需要Book对象
book.fn3()
book.fn4()

fn2,fn3,fn4均不能访问实例中的变量name, 均可以通过Book.version来访问version变量。 类方法可以方便的通过cls来引用类对象中的变量。