python的@classmethod和@staticmethod
来源:互联网 发布:淘宝首页轮播大图代码 编辑:程序博客网 时间:2024/05/19 02:42
本文是对StackOverflow上的一篇高赞回答的不完全翻译,原文链接:meaning-of-classmethod-and-staticmethod-for-beginner
Python面向对象编程中,类中定义的方法可以是@classmethod 装饰的类方法,也可以是@staticmethod 装饰的静态方法,用的最多的还是不带装饰器的实例方法。为方便,在下文中用@classmethod装饰的类方法将直接用@classmethod来表述,@staticmethod同理,望读者在阅读时自行加以区分。
@classmethod和@staticmethod很相似,它们装饰的方法在使用上只有一点区别:@classmethod装饰的方法第一个参数必须是一个类(通常为cls),而@staticmethod装饰的方法则按业务需求设置参数,也可以根本没有参数。
样例
样例是一个处理日期信息的类,如下:
class Date(object): def __init__(self, day=0, month=0, year=0): self.day = day self.month = month self.year = year
这个类可以用来存储指定日期(不包括时区信息,假设所有日期都是UTC时间)。
这个类有一个__init__函数用来初始化实例对象,它的第一个必须的参数self指向一个已创建的Date类的实例对象,这个方法是一个典型的实例方法。
Class Method
有些任务用@classmethod 可以很好地完成。
假设我们要从一堆有着特定日期格式的字符串(如'dd-mm-yyyy')创建很多对应的Date类的实例,而且在项目的各个地方都要进行这样的转换。那么我们要做的是:
1. 解析一个字符串来得到day,month,year这三个整数变量或者组装出一个tuple
2. 把这些值传递给初始化函数来实例化Date实例对象
比如:
day, month, year = map(int, string_date.split('-'))date1 = Date(day, month, year)
要实现这个目的,C++可以使用重载,但是Python没有这样的语法,但是可以使用@classmethod来实现,如下:
@classmethod def from_string(cls, date_as_string): day, month, year = map(int, date_as_string.split('-')) date1 = cls(day, month, year) return date1date2 = Date.from_string('11-09-2012')
仔细比较这两种方法,使用@classmethod有以下优点:
1. 我们只写了一个转换字符串的方法,而且这个方法是可重用的。
2. 把这个方法封装在类中,更紧密(也许你会认为可以写一个单独的函数去转换字符串,但是使用@classmethod更符合面向对象的思维)。
3. cls 是类本身的对象,而不是类的实例对象,这样的话继承自Date的对象都会有from_string这个方法。
Static Method
那么@staticmethod呢?其实它跟@classmethod非常相似,只是它没有任何必需的参数。
假设我们要去检验一个日期的字符串是否有效。这个任务与Date类相关,但是又不需要Date实例对象,在这样的情况下@staticmethod就可以派上用场了。如下:
@staticmethod def is_date_valid(date_as_string): day, month, year = map(int, date_as_string.split('-')) return day <= 31 and month <= 12 and year <= 3999 # usage: is_date = Date.is_date_valid('11-09-2012')
从上面的用法可以看出,它只是一个功能,调用的语法和一般的方法调用一样,也不访问实例对象那和它的内部字段和方法。
- python的staticmethod和classmethod
- python的@classmethod和@staticmethod
- python staticmethod和classmethod
- Python @staticmethod和@classmethod
- 【python】classmethod 和staticmethod
- python classmethod和staticmethod
- python的staticmethod、classmethod
- python 的@classmethod &&@staticmethod
- Python @staticmethod 和 @classmethod 的异同
- 【Python】Staticmethod和classmethod的区别
- Python中的staticmethod和classmethod 的异同
- python中staticmethod和classmethod的区别
- Python的classmethod和staticmethod区别
- python中classmethod和staticmethod的区别
- Python @classmethod 和 @staticmethod的比较
- python的classmethod和staticmethod方法
- python中staticmethod和classmethod的区别
- Python中的staticmethod和classmethod
- DARICO——结合了比特币增长潜力和黄金安全性的优势
- Linux获取文件属性stat()、fstat()、lstat()函数实例学习
- 关于在ubuntu16.04 64位系统上安装交叉编译工具出现错误的解决方法
- 撤销功能的实现——备忘录模式(一)
- 火柴棍等式
- python的@classmethod和@staticmethod
- 类的常见使用方法,包含静态内部类,懒汉类的
- HDOJ 1017 (水题)
- 树与二叉树基本概念与性质
- R绘图系统中的坐标系
- Activity 生命周期函数执行过程详解
- Ubuntu 14 使用火狐浏览器
- Floyd算法
- pytorch入门(一)-----Autograd