‘继承内置类,继承datetime.date,察看安装package的所在位置’
因为经常使用到python datetime date这个功能。这个类提供了许多处理日期的方法,非常好用。然而,这个类的初始化方法总是有一些不如人意的地方。比如, I usually create a new date object by adding input a date string (20101010), however, std date class only accept (2010,10,10). It will be very awkward everytime when you spit your string like str[:4] etc....
打算在自己的个人lib中,添加一个self-defined class. This is the code:
- from datetime import date
- class mydate(date):
- def __init__(self,dstr):
- print 'hello'
- #super(mydate,self).__init__(int(dstr[:4]),int(dstr[4:6]),int(dstr[6:]))
- print int(dstr[:4]),int(dstr[4:6]),int(dstr[6:])
- date.__init__(self,int(dstr[:4]),int(dstr[4:6]),int(dstr[6:]))
- if __name__ == '__main__':
- str = '20101010'
- print date(2010,10,11)
- b = mydate(str)
- print b
ok
这个时候问题出现了,不管怎么执行python解释期总是提示
- Traceback (most recent call last):
- File "./DateTime.py", line 18, in
- b = mydate(str)
- TypeError: an integer is required
经过无数次的google后,终于找出其中的原因。 class date use new to create new class. The issue therefore, become the difference between __new__ and __init__.
这个时间,我的第一反应就是就看看源代码。好吧。我承认我不知道datetime的源码在什么地方。So let's check out the python lib path by :
- import sys
- print sys.path
郁闷的事情再次发生,找遍lib下的目录 还是找不到任何datetime的文件。查找手册等方式找到下面这个找method:
- import package
- print package.__file__
- >>> import datetime
- >>> datetime.__file__
- '/python/core/2.6.4/exec/lib/python2.6/lib-dynload/datetime.so'
看到这步就差不多了。可是源码呢? 开玩笑,这个so是二进制代码,你还想看源码。去官方网站把。
废话讲了这么多,回到问题本身吧。事实上date类是使用new这个方法去创建新对象的。自然而然,我们需要先覆盖这个方法。
先上代码,在做解释:
- from datetime import date
- class mydate(date):
- def __new__(self,dstr):
- print 'hello'
- #super(mydate,self).__init__(int(dstr[:4]),int(dstr[4:6]),int(dstr[6:]))
- print int(dstr[:4]),int(dstr[4:6]),int(dstr[6:])
- return date.__new__(self,int(dstr[:4]),int(dstr[4:6]),int(dstr[6:]))
- if __name__ == '__main__':
- str = '20101010'
- print date(2010,10,11)
- b = mydate(str)
- print b
python有两个“构造方法“,new 和 init。 当一个类中已经定义了new ,那么无论如何创建对象时,总是调用该方法。
new 和init 的其他区别例如,new 需要明确return,而init则implicit return 了。
阅读(2539) | 评论(0) | 转发(0) |