静态方法、类方法和成员方法有什么区别¶
静态方法和类方法功能接近,类方法是加上一个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来引用类对象中的变量。