1.形式上的异同点:

在形式上,Python中:实例方法必须有self,类方法用@classmethod装饰必须有cls,静态方法用@staticmethod装饰不必加cls或self,如下代码所示:

 class A(object):
def __init__(self, name):
self.name = name def get_a_object(self):
return "get object method:{}".format(self.name) @staticmethod
def get_b_static():
return "get static method" @classmethod
def get_c_class(cls):
return "get class method" a = A(name="method")
print("{} by object method".format(a.get_a_object()))
try:
print(A.get_a_object())
except Exception:
print("Class can not call the instance method directly by class method")
print("{} by class method".format(A.get_b_static()))
print("{} by object method".format(a.get_b_static()))
print("{} by class method".format(A.get_c_class()))
print("{} by object method".format(a.get_c_class()))

执行结果:

get object method:method by object method
Class can not call the instance method directly by class method
get static method by class method
get static method by object method
get class method by class method
get class method by object method

从执行结果可以看出,实例方法必须实例化后调用不可用类点方法直接调用,静态方法和类方法既可以用实例点方法调用也可用类点方法直接调用

2.应用场景及本质上的异同点

对于应用场景上异同点主要是比较类方法和静态方法,先看一段代码:

 class Date:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day @staticmethod
def today_static():
t = time.localtime()
return Date(t.tm_year, t.tm_mon, t.tm_mday) @classmethod
def today(cls):
t = time.localtime()
return cls(t.tm_year, t.tm_mon, t.tm_mday) class NewDate(Date):
pass date = Date(2018, 12, 31)
new_data = NewDate(2018,12,31) print("class method -------------")
print(date.today().__class__)
print(Date.today().__class__)
print(NewDate.today().__class__)
print(new_data.today().__class__)
print("\n")
print("static method ------------")
print(date.today_static().__class__)
print(Date.today_static().__class__)
print(NewDate.today_static().__class__)
print(new_data.today_static().__class__)
Date类有year、month、day三个属性,静态方法today_static,类方法today,
NewDate类继承于Date,分别打印调用类方法和静态方法时属于哪个类
class method -------------
<class '__main__.Date'>
<class '__main__.Date'>
<class '__main__.NewDate'>
<class '__main__.NewDate'> static method ------------
<class '__main__.Date'>
<class '__main__.Date'>
<class '__main__.Date'>
<class '__main__.Date'>

通过结果可以看出:对于类方法today,调用Date.today()时cls=Date,调用NewDate.today()时,cls=NewDate,cls跟随调用类的变化而变化;对于静态方法today_static,指定了Date(t.tm_year, t.tm_mon, t.tm_mday),所以所属的类始终是Data,如果将Date改为:

class Date1:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day

此时对于@classmethod不会有任何变化,但是对于@staticmethod 如果today_static 返回值不是Date1(t.tm_year, t.tm_mon, t.tm_mday),则会报错

python中@staticmethod、@classmethod和实例方法的更多相关文章

  1. python中staticmethod classmethod及普通函数的区别

    staticmethod 基本上和一个全局函数差不多,只不过可以通过类或类的实例对象 (python里光说对象总是容易产生混淆, 因为什么都是对象,包括类,而实际上 类实例对象才是对应静态语言中所谓对 ...

  2. 【python】Python 中的 classmethod 和 staticmethod

    Python 中的 classmethod 和 staticmethod 有什么具体用途? 推荐地址:http://www.cnblogs.com/wangyongsong/p/6750454.htm ...

  3. 基于python中staticmethod和classmethod的区别(详解)

    例子 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 class A(object):   def foo(self,x):     print "executing foo ...

  4. 关于Python中的classmethod

    Python 中的 classmethod classmethod: 作用是直接将自己的类对象,传给类方法. 一.classmethod 1)不用classmethod的时候 你的代码可能是这样写的, ...

  5. python中 staticmethod与classmethod

    原文地址https://blog.csdn.net/youngbit007/article/details/68957848 原文地址https://blog.csdn.net/weixin_3565 ...

  6. python 类中staticmethod,classmethod,普通方法

    1.staticmethod:静态方法和全局函数类似,但是通过类和对象调用. 2.classmethod:类方法和类相关的方法,第一个参数是class对象(不是实例对象).在python中class也 ...

  7. Python中的类方法、实例方法、静态方法

    类方法 @classmethod 在python中使用较少,类方法传入的第一个参数是 cls,是类本身: 类方法可以通过类直接调用或者通过实例直接调用,但无论哪种调用方式,最左侧传入的参数一定是类本身 ...

  8. python中@staticmethod与@classmethod

    @ 首先这里介绍一下‘@’的作用,‘@’用作函数的修饰符,是python2.4新增的功能,修饰符必须出现在函数定义前一行,不允许和函数定义在同一行.只可以对模块或者类定义的函数进行修饰,不允许修饰一个 ...

  9. Python 中的 classmethod 和 staticmethod 有什么具体用途?

    作者:李保银链接:https://www.zhihu.com/question/20021164/answer/18224953来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

随机推荐

  1. ajax请求封装的公共方法

    /** * post 方法 */ function ajaxPost(url, params, callBack) { ajax(url,params,"post",callBac ...

  2. 部署apache-tomcat环境

    软件体系: C/S:客户端/服务器,例如qq等app都属于C/S体系,除了编写服务端代码还需要编写客户端 优点:展现比较好,客户端会承受一点运算压力,安全性比较好 缺点:更新服务端的同时还需要更新客户 ...

  3. 06 元祖 字典 集合set

    元组 定义: ti=() print(ti,type(ti)) 参数:for可以循环的对象(可迭代对象) t2=tuple(") # ('1', '2', '3') <class 't ...

  4. Vmware Workstation _linux yum 仓库搭建

    0:检查 vm虚拟机光盘是否已经连接 1. 检测yum 仓库是否已经配置好 [root@oracle ~]# yum list all 如果输入这条指令可以正确显示出rpm 包的列表,则说明yum 仓 ...

  5. Confluence 6 编辑站点欢迎消息使用模板编辑器的小提示

    站点欢迎消息是一个模板而不是一个页面,所以你需要使用模板编辑器来对你的消息进行编辑. 你可以和在你 Confluence 中其他页面中一样,在站点欢迎消息模板中添加文本,连接和宏.但是添加图片的话会有 ...

  6. 基于Manhattan最小生成树的莫队算法

    点u,v的Manhattan距离:distance(u,v)= |x2-x1|+|y2-y1| Manhattan最小生成树:边权值为两个点Manhattan距离的最小生成树. 普通算法:prim复杂 ...

  7. tmk射气球

    问题 : tmk射气球 时间限制: 1 Sec  内存限制: 128 MB 题目描述 有一天TMK在做一个飞艇环游世界,突然他发现有一个气球沿匀速沿直线飘过,tmk想起了他飞艇上有一把弓,他打算拿弓去 ...

  8. Java手动释放对象

    伪代码 public void updateUser(BufferedWriter writer, BufferedReader reader) { List<User> array = ...

  9. Unnamed namespaces

    Unnamed namespaces The unnamed-namespace-definition is a namespace definition of the form   inline(o ...

  10. win(64位)环境下oracle11g的安装方法

    将压缩文件解压到一个目录中,该目录结构如下: 安装步骤(摘自网络): 1.进入数据库解压目录,双击其中的“setup.exe”文件,稍等片刻出现如下“配置安全更新“界面,取消“我希望通过My Orac ...