当前位置:  开发笔记 > 编程语言 > 正文

为什么我不能将datetime.date子类化?

如何解决《为什么我不能将datetime.date子类化?》经验,为你挑选了2个好方法。

以下为什么不工作(Python 2.5.2)?

>>> import datetime
>>> class D(datetime.date):
        def __init__(self, year):
            datetime.date.__init__(self, year, 1, 1)
>>> D(2008)
Traceback (most recent call last):
  File "", line 1, in 
TypeError: function takes exactly 3 arguments (1 given)

我想创建一个类似datetime.date但具有不同__init__功能的类.显然我的功能永远不会被调用.相反,原来datetime.date.__init__被调用并失败,因为这需要3个参数,而我正在传递一个.

这里发生了什么?这是一个线索吗?

>>> datetime.date.__init__

谢谢!



1> A. Coady..:

关于其他几个答案,这与用C本身实现的日期没有任何关系.该__init__方法无效,因为它们是不可变对象,因此构造函数(__new__)应该完成所有工作.您会看到子类化int,str等的相同行为.

>>> import datetime
>>> class D(datetime.date):
        def __new__(cls, year):
            return datetime.date.__new__(cls, year, 1, 1)


>>> D(2008)
D(2008, 1, 1)



2> tzot..:

请阅读关于数据模型的Python参考,特别是有关__new__ 特殊方法的参考.

摘录自该页面(我的斜体):

__new__()主要用于允许不可变类型的子类(如int,str或tuple)自定义实例创建.它也通常在自定义元类中重写,以自定义类创建.

datetime.datetime 也是一种不可变的类型.

PS如果您认为:

用C实现的对象不能被子类化,或者

__init__ 不会仅为C实现的对象调用 __new__

那请试试吧:

>>> import array
>>> array

>>> class A(array.array):
    def __init__(self, *args):
        super(array.array, self).__init__(*args)
        print "init is fine for objects implemented in C"

>>> a=A('c')
init is fine for objects implemented in C
>>> 

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有