博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python中@staticmethod、@classmethod和实例方法
阅读量:5969 次
发布时间:2019-06-19

本文共 2819 字,大约阅读时间需要 9 分钟。

1.形式上的异同点:

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

1 class A(object): 2     def __init__(self, name): 3         self.name = name 4  5     def get_a_object(self): 6         return "get object method:{}".format(self.name) 7  8     @staticmethod 9     def get_b_static():10         return "get static method"11 12     @classmethod13     def get_c_class(cls):14         return "get class method"15 16 17 a = A(name="method")18 print("{} by object method".format(a.get_a_object()))19 try:20     print(A.get_a_object())21 except Exception:22     print("Class can not call the instance method directly by class method")23 print("{} by class method".format(A.get_b_static()))24 print("{} by object method".format(a.get_b_static()))25 print("{} by class method".format(A.get_c_class()))26 print("{} by object method".format(a.get_c_class()))

执行结果:

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

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

 

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

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

1 class Date: 2     def __init__(self, year, month, day): 3         self.year = year 4         self.month = month 5         self.day = day 6  7     @staticmethod 8     def today_static(): 9         t = time.localtime()10         return Date(t.tm_year, t.tm_mon, t.tm_mday)11 12     @classmethod13     def today(cls):14         t = time.localtime()15         return cls(t.tm_year, t.tm_mon, t.tm_mday)16 17 18 class NewDate(Date):19     pass20 21 date = Date(2018, 12, 31)22 new_data = NewDate(2018,12,31)23 24 print("class method -------------")25 print(date.today().__class__)26 print(Date.today().__class__)27 print(NewDate.today().__class__)28 print(new_data.today().__class__)29 print("\n")30 print("static method ------------")31 print(date.today_static().__class__)32 print(Date.today_static().__class__)33 print(NewDate.today_static().__class__)34 print(new_data.today_static().__class__)
Date类有year、month、day三个属性,静态方法today_static,类方法today, NewDate类继承于Date,分别打印调用类方法和静态方法时属于哪个类
class method -------------
static method ------------
 

通过结果可以看出:对于类方法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),则会报错

转载于:https://www.cnblogs.com/FG123/p/9683510.html

你可能感兴趣的文章
Linux中date命令的各种实用方法--转载
查看>>
mysqld -install命令时出现install/remove of the service denied错误的原因和解决办法
查看>>
苹果企业版帐号申请记录
查看>>
C++ Error: error LNK2019: unresolved external symbol
查看>>
Bitmap 和Drawable 的区别
查看>>
Java操作mongoDB2.6的常见API使用方法
查看>>
如何给服务器设置邮件警报。
查看>>
CEF js调用C#封装类含注释
查看>>
麦克劳林
查看>>
Eclipse SVN修改用户名和密码
查看>>
架构师的职责都有哪些?
查看>>
SVN: bdb: BDB1538 Program version 5.3 doesn't match environment version 4.7
查看>>
jsp内置对象作业3-application用户注册
查看>>
android115 自定义控件
查看>>
iOS uuchart 用法
查看>>
c# 多线程 调用带参数函数
查看>>
JQuery 如何选择带有多个class的元素
查看>>
The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar
查看>>
VS快速生成JSON数据格式对应的实体
查看>>
Word2vec 模型载入(tensorflow)
查看>>