一般情况,要使用某个类的方法,需要先实例化一个对象再调用方法。
而使用@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