Chinaunix首页 | 论坛 | 博客
  • 博客访问: 262814
  • 博文数量: 54
  • 博客积分: 1761
  • 博客等级: 上尉
  • 技术积分: 585
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-17 23:30
文章分类

全部博文(54)

文章存档

2013年(4)

2012年(7)

2011年(15)

2010年(28)

分类: Python/Ruby

2011-01-06 16:38:08

‘继承内置类,继承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:
  1. from datetime import date

  2. class mydate(date):
  3.     def __init__(self,dstr):
  4.         print 'hello'
  5.         #super(mydate,self).__init__(int(dstr[:4]),int(dstr[4:6]),int(dstr[6:]))
  6.         print int(dstr[:4]),int(dstr[4:6]),int(dstr[6:])
  7.         date.__init__(self,int(dstr[:4]),int(dstr[4:6]),int(dstr[6:]))
  8. if __name__ == '__main__':
  9.     str = '20101010'
  10.     print date(2010,10,11)
  11.     b = mydate(str)
  12.     print b
 
ok
 
这个时候问题出现了,不管怎么执行python解释期总是提示
  1. Traceback (most recent call last):
  2. File "./DateTime.py", line 18, in
  3. b = mydate(str)
  4. 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 :
  1. import sys
  2. print sys.path
郁闷的事情再次发生,找遍lib下的目录 还是找不到任何datetime的文件。查找手册等方式找到下面这个找method:
  1. import package
  2. print package.__file__
  3. >>> import datetime
  4. >>> datetime.__file__
  5. '/python/core/2.6.4/exec/lib/python2.6/lib-dynload/datetime.so'
看到这步就差不多了。可是源码呢? 开玩笑,这个so是二进制代码,你还想看源码。去官方网站把。
 
废话讲了这么多,回到问题本身吧。事实上date类是使用new这个方法去创建新对象的。自然而然,我们需要先覆盖这个方法。
先上代码,在做解释:
  1. from datetime import date

  2. class mydate(date):
  3.     def __new__(self,dstr):
  4.         print 'hello'
  5.         #super(mydate,self).__init__(int(dstr[:4]),int(dstr[4:6]),int(dstr[6:]))
  6.         print int(dstr[:4]),int(dstr[4:6]),int(dstr[6:])
  7.         return date.__new__(self,int(dstr[:4]),int(dstr[4:6]),int(dstr[6:]))
  8. if __name__ == '__main__':
  9.     str = '20101010'
  10.     print date(2010,10,11)
  11.     b = mydate(str)
  12.     print b
python有两个“构造方法“,new 和 init。 当一个类中已经定义了new ,那么无论如何创建对象时,总是调用该方法。
new 和init 的其他区别例如,new 需要明确return,而init则implicit return 了。
 
阅读(2539) | 评论(0) | 转发(0) |
0

上一篇:kdb/q的IPC通信

下一篇:语法糖概念

给主人留下些什么吧!~~