对于python的初学者,了解实例方法,类方法 以及静态方法并不是特别的重要,但是若想更好的利用python作为自己的编程工具,则不得不学。在此先说明一下,有人会问python2.7.x以及python3.x先学哪个好,其实我觉得两者并没有太多的区别。在许多公司都会沿用python2.7.x,这是历史原因。虽说官方建议python3,但是不代表python2比python3性能差,而且github上的许多开源项目都会使用python2和python3同时用。
Example
class ClassA():
def __init__(self):
print("init class")
def method(self):
print("start method")
@classmethod
def class_method(cls):
print("start class method ", cls)
@staticmethod
def static_method():
print("start static method")
def tools(self):
ClassA.static_method()
if __name__ == '__main__':
## 实例方法
p = ClassA()
p.method()
## 等同于
ClassA().method()
## 类方法
c = ClassA()
c.class_method()
## 等同于
ClassA.class_method()
## 静态方法
ClassA.static_method()
s = ClassA()
s.tools()
实例方法
实例方法需要将类实例化后调用,如果使用类直接调用实例方法,需要显式地将实例作为参数传入。明确特征是self作为传入参数,并且位置居于最左侧。
类方法
,类方法传入的第一个参数为cls,是类本身。并且,类方法可以通过类直接调用,或通过实例直接调用。但无论哪种调用方式,最左侧传入的参数一定是类本身,即是cls。
但是值得注意的是
class BaseA():
def __init__(self):
print("init baseA")
@classmethod
def class_method(cls):
print("current class ", cls)
class TestA(BaseA):
pass
if __name__ == '__main__':
TestA.class_method()
current class <class '__main__.TestA'>
从运行结果可以看出,无论是类调用还是实例调用,类方法都能正常工作。且通过打印cls,可以看出cls传入的都是类实例本身。
静态方法
在调用过程中,无需将类实例化,直接在类之后使用.号运算符调用方法。通常情况下,静态方法使用@staticmethod装饰器来声明。而在Python 3中,如果一个类的方法不需要self参数,不再需要声明为静态方法,但是这样的话只能通过类去调用这个方法,如果使用实例调用这个方法会引发异常。