为什么需要静态方法?
2017-11-16 21:24
225 查看
首先,定义一个Pizza类:
我们可以得到:
#cook是一个方法。
>>> Pizza.cook
<function Pizza.cook at 0x029A10C0>
#要调用cook方法必须实例化Pizza类。
>>> Pizza.cook()
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
Pizza.cook()
TypeError: cook() missing 1 required positional argument: 'self'
>>> Pizza().cook()
0
#不同的实例化不相同
>>> Pizza() is Pizza()
False
#cook方法依赖于类的实例
>>> Pizza().cook is Pizza().cook
False
>>>
然后,定义一个静态方法:
我们可以得到:
#静态方法也是方法的一种
>>> Pizza.cook
<function Pizza.cook at 0x02B310C0>
#调用静态方法cook不需要实例化Pizza类。
>>> Pizza.cook()
0
#不同的实例化不相同
>>> Pizza() is Pizza()
False
#不同实例的cook方法相同,实例与类的cook方法相同 ——> 静态方法cook不需要依赖于类的实例。
#静态方法即可以被类调用,同样类的实例也可以调用,只是这样会耗用更多的资源而已(不专业)。
>>> Pizza().cook is Pizza().cook
True
>>> Pizza().cook is Pizza.cook
True
>>>
复制代码
可得结论:
类的方法在使用时,必须实例化类;而静态方法不需要依赖于类的实例化。Python 可以直接使用静态方法,而避免了去实例化一个对象。实例化对象需要消耗资源的,静态方法避免了这一切。
class Pizza(object): def cook(self): return 0
我们可以得到:
#cook是一个方法。
>>> Pizza.cook
<function Pizza.cook at 0x029A10C0>
#要调用cook方法必须实例化Pizza类。
>>> Pizza.cook()
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
Pizza.cook()
TypeError: cook() missing 1 required positional argument: 'self'
>>> Pizza().cook()
0
#不同的实例化不相同
>>> Pizza() is Pizza()
False
#cook方法依赖于类的实例
>>> Pizza().cook is Pizza().cook
False
>>>
然后,定义一个静态方法:
class Pizza(object): @staticmethod def cook():#不需要传入参数 return 0;
我们可以得到:
#静态方法也是方法的一种
>>> Pizza.cook
<function Pizza.cook at 0x02B310C0>
#调用静态方法cook不需要实例化Pizza类。
>>> Pizza.cook()
0
#不同的实例化不相同
>>> Pizza() is Pizza()
False
#不同实例的cook方法相同,实例与类的cook方法相同 ——> 静态方法cook不需要依赖于类的实例。
#静态方法即可以被类调用,同样类的实例也可以调用,只是这样会耗用更多的资源而已(不专业)。
>>> Pizza().cook is Pizza().cook
True
>>> Pizza().cook is Pizza.cook
True
>>>
复制代码
可得结论:
类的方法在使用时,必须实例化类;而静态方法不需要依赖于类的实例化。Python 可以直接使用静态方法,而避免了去实例化一个对象。实例化对象需要消耗资源的,静态方法避免了这一切。
相关文章推荐
- 子类为什么不能重写父类的静态方法
- 子类为什么不能重写父类的静态方法
- object对象重写equals方法时为什么需要重写hashCode方法
- 为什么静态成员、静态方法中不能用this和super关键字
- 子类为什么不能重写父类的静态方法
- 为什么VB.net的Shared(共享)方法在C#中叫Static(静态)?
- 为什么Python类的方法需要加self作为第一个参数?
- 子类为什么不能重写父类的静态方法
- 笔试题:和wait()比较一下,thread中的sleep()的方法为什么被设计为静态方法?
- main方法为什么是静态的
- 为什么使用静态方法
- 什么时候需要重写equals方法?为什么重写equals方法,一定要重写HashCode方法?
- 为什么静态方法中不可以直接访问非静态方法
- spring注入时bean的set方法为什么不能是static类型的?(为什么要用单例模式而不是静态方法)
- Java 中,为什么在静态方法中可以调用的方法、可以使用的成员变量必须是静态的?
- 【Java基础之重写equals、hashCode和compareTo方法】什么时候需要重写重写equals方法?为什么重写equals方法,一定要重写HashCode方法?
- 《Java程序员面试笔试宝典》之为什么需要public static void main(String[] args)这个方法
- 为什么有两种方法来处理Spring中的静态资源(addResourceHandlers和容器的默认Servlet)
- 静态方法为什么不能使用this和super关键字
- WordPress中文标签伪静态设置方法,以及为什么出错?