天天看點

@staticmethod和@classmethod的作用與差別

一般情況,要使用某個類的方法,需要先執行個體化一個對象再調用方法。

而使用@staticmethod或@classmethod,就可以不需要執行個體化,直接類名.方法名()來調用。

既然@staticmethod和@classmethod都可以直接類名.方法名()來調用,那他們有什麼差別呢

從它們的使用上來看,

    - 

@staticmethod 不需要表示自身對象的self和自身類的cls參數,就跟使用函數一樣。

@classmethod 也不需要self參數,但第一個參數需要是表示自身類的cls參數。

@classmethod 是一個函數修飾符,它表示接下來的是一個類方法,而對于平常我們見到的則叫做執行個體方法。 類方法的第一個參數cls,而執行個體方法的第一個參數是self,表示該類的一個執行個體。 

普通對象方法至少需要一個self參數,代表類對象執行個體

類方法有類變量cls傳入,進而可以用cls做一些相關的處理。并且有子類繼承時,調用該類方法時,傳入的類變量cls是子類,而非父類。 對于類方法,可以通過類來調用,就像Test.foo()

如果在@staticmethod中要調用到這個類的一些屬性方法,隻能直接類名.屬性名或類名.方法名。

代碼示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

<code>#!/usr/local/python3/bin/python3</code>

<code>class</code> <code>Door(</code><code>object</code><code>):</code>

<code>    </code><code>a </code><code>=</code> <code>1</code>

<code>    </code><code>def</code> <code>__init__(</code><code>self</code><code>,num,status):</code>

<code>        </code><code>self</code><code>.num </code><code>=</code> <code>num</code>

<code>        </code><code>self</code><code>.status </code><code>=</code> <code>status</code>

<code>    </code><code>def</code> <code>open</code><code>(</code><code>self</code><code>):</code>

<code>        </code><code>self</code><code>.var </code><code>=</code> <code>0</code>

<code>        </code><code>self</code><code>.status </code><code>=</code> <code>'open'</code>

<code>    </code><code>def</code> <code>close(</code><code>self</code><code>):</code>

<code>        </code><code>self</code><code>.status </code><code>=</code> <code>'closed'</code>

<code>    </code><code>def</code> <code>__test(</code><code>self</code><code>):</code>

<code>        </code><code>print</code> <code>(</code><code>'__test'</code><code>)</code>

<code>    </code><code>@</code><code>classmethod</code>

<code>    </code><code>def</code> <code>test(</code><code>cls</code><code>):</code>

<code>        </code><code>print</code><code>(</code><code>"class test"</code><code>)</code>

<code>#不需要self參數,但第一個參數需要是表示自身類的cls參數。        </code>

<code>        </code><code>print</code><code>(</code><code>cls</code><code>.a)</code>

<code>    </code><code>@</code><code>staticmethod</code>

<code>    </code><code>def</code> <code>test2():</code>

<code>        </code><code>print</code><code>(</code><code>"static test2"</code><code>)</code>

<code>#不需要自身對象參數,直接使用類名+類變量調用        </code>

<code>        </code><code>print</code><code>(Door.a)</code>

<code>        </code> 

<code>Door.test()</code>

<code>d1 </code><code>=</code> <code>Door(</code><code>1</code><code>,</code><code>"closed"</code><code>)</code>

<code>d1.test()</code>

<code>#通過類名調用和通過執行個體調用</code>

<code>d2 </code><code>=</code> <code>Door(</code><code>2</code><code>,</code><code>"closed"</code><code>)</code>

<code>Door.test2()</code>

<code>d2.test2()</code>

輸出結果:

<a href="http://s3.51cto.com/wyfs02/M02/71/58/wKiom1XLeBPTZxUPAABmL6p9YFE210.jpg" target="_blank"></a>

本文轉自qw87112 51CTO部落格,原文連結:http://blog.51cto.com/tchuairen/1684201