新手理解@classmethod及@staticmethod
2016-04-14 11:46
441 查看
staticmethod相当于一个定义在类里面的函数,所以如果一个方法既不跟实例相关也不跟特定的类相关,推荐将其定义为一个staticmethod,这样不仅使代码一目了然,而且似的利于维护代码。
子类调用方法隐形传入的参数为该对象所对应的类,调用过程中动态生成了对应的类的类变量。
理解classicmethod和staticmethod类是一种数据结构,可以创建对象。当调用类的时候就创建了一个类的实例对象。一旦对象被创建,python 就会检查是否实现了init()方法。如果init()已经被实现,那么它将被调用,实例对象作为第一个参数(self)被传递进去。
举个例子,定义一个存储日期信息的类Date,这里重新定义了初始化函数。
如果我们需要调用tell Date方法,我们就必须先创建一个实例,或者使用Date().tellDate()
现在假设我们需要创建很多Date的实例,日期信息以字符串的形式从外部传入,格式为'dd-mm-yyyy'。需要做的事
将日期信息字符串parse成一个含有年月日三个变量的元组;
实例化一个Date对象时就将年月日作为参数传入。
就像这样:
python不能像C++那样进行重载,所以我们引入class method ,它不需要self参数,但需要第一个参数是表示自身类的cls参数。
这样编程的好处有:
分解字符串操作可以重复使用,而我们只需要传入参数一次;
OOP;
cos是类本身,而不是类的实例,当我们将Date作为父类时,其子类也会拥有from_string方法
和class method很相似的是staticmethod,但它不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
运行结果为:
更新:
发现一篇很好的资料staticmethod和classmethod
子类调用方法隐形传入的参数为该对象所对应的类,调用过程中动态生成了对应的类的类变量。
理解classicmethod和staticmethod类是一种数据结构,可以创建对象。当调用类的时候就创建了一个类的实例对象。一旦对象被创建,python 就会检查是否实现了init()方法。如果init()已经被实现,那么它将被调用,实例对象作为第一个参数(self)被传递进去。
举个例子,定义一个存储日期信息的类Date,这里重新定义了初始化函数。
class Date(object): day = 0 month = 0 year = 0 def __init__(self, day=0, month=0, year=0): self.day = day self.month = month self.year = year def tellDate(self): print 'Today is %s-%s-%s'%(self.day,self.month,self.year)</span>
如果我们需要调用tell Date方法,我们就必须先创建一个实例,或者使用Date().tellDate()
date1 = Date() date1.tellDate()
如何直接使用类名调用函数呢?
使用@classmethod或@staticmethod都可以类名.方法名()调用函数现在假设我们需要创建很多Date的实例,日期信息以字符串的形式从外部传入,格式为'dd-mm-yyyy'。需要做的事
将日期信息字符串parse成一个含有年月日三个变量的元组;
实例化一个Date对象时就将年月日作为参数传入。
就像这样:
day, month, year = map(int, string_date.split('-')) date1 = Date(day, month, year)
python不能像C++那样进行重载,所以我们引入class method ,它不需要self参数,但需要第一个参数是表示自身类的cls参数。
@classmethod def from_string(cls, date_as_string): day, month, year = map(int, date_as_string.split('-')) date1 = cls(day, month, year) return date1使用时可以直接类名.方法名()
这样编程的好处有:
分解字符串操作可以重复使用,而我们只需要传入参数一次;
OOP;
cos是类本身,而不是类的实例,当我们将Date作为父类时,其子类也会拥有from_string方法
和class method很相似的是staticmethod,但它不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
<span style="font-size:14px;">@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 </span>
所有程序及运行结果
<pre name="code" class="python">class Date(object):
day = 0
month = 0
year = 0
def __init__(self, day=0, month=0, year=0):
self.day = day
self.month = month
self.year = year
def tellDate(self):
print 'Today is %s-%s-%s'%(self.day,self.month,self.year)
@classmethod
def from_string(cls, date_as_string):
day, month, year = map(int, date_as_string.split('-'))
date = cls(day, month, year)
return date
@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
if __name__ == '__main__':
date1 = Date() date1.tellDate()
date2 = Date.from_string("14-04-2016")
date2.tellDate()
print Date.is_date_valid("14-04-2016")
运行结果为:
Today is 0-0-0 Today is 14-4-2016 True
更新:
发现一篇很好的资料staticmethod和classmethod
相关文章推荐
- 其他
- 写于2016年4月
- 关于getContext()、getApplication()、getApplicationContext()、getActivity()的区别
- 取消代码中的注释
- Acdroid 波浪按钮 rippleview
- LeetCode 23. Merge k Sorted Lists
- apache-jmeter学习文档
- 在Mac上安装MongoDB
- VS断点失效时候的处理
- PHP 时间 date,strtotime ,time计算1970开始的第几天
- android录音时弹出权限选择框影响录音动画显示问题
- Spring MVC异常处理SimpleMappingExceptionResolver【转】
- Hasor-RSF —— 分布式服务框架
- OpenCV的Rect矩形类用法
- zen-coding的语法记录
- MySQL基础十:MySQL图形管理工具
- atitit. applet 浏览器插件 控件 的环境,开发,提示总结o9o
- 哈希表的学习(结合多篇博文)
- Linux内核分析之理解进程调度时机跟踪分析进程调度与进程切换的过程
- window打开运行快捷键