为什么我不能子类化 datetime.date ?
为什么以下不起作用(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 "<stdin>", line 1, in <module>
TypeError: function takes exactly 3 arguments (1 given)
我想创建一个类似于 datetime.date 的类,但具有不同的 __init__ 函数。 显然我的函数永远不会被调用。 相反,原始的 datetime.date.__init__
被调用并失败,因为它需要 3 个参数,而我传递了一个参数。
这里发生了什么? 这是一个线索吗?
>>> datetime.date.__init__
<slot wrapper '__init__' of 'object' objects>
谢谢!
Why doesn't the following work (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 "<stdin>", line 1, in <module>
TypeError: function takes exactly 3 arguments (1 given)
I wanted to create a class that was just like datetime.date
, but with a different __init__
function. Apparently my function never gets called. Instead the original datetime.date.__init__
is called and fails because that expects 3 arguments and I am passing in one.
What's going on here? And is this a clue?
>>> datetime.date.__init__
<slot wrapper '__init__' of 'object' objects>
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
关于其他几个答案,这与 C 本身实现的日期没有任何关系。
__init__
方法不执行任何操作,因为它们是不可变对象,因此构造函数 (__new__
) 应该完成所有工作。 您会看到相同的行为,将 int、str 等子类化。Regarding several other answers, this doesn't have anything to do with dates being implemented in C per se. The
__init__
method does nothing because they are immutable objects, therefore the constructor (__new__
) should do all the work. You would see the same behavior subclassing int, str, etc.请阅读关于数据模型的Python参考,特别是关于
__new__
特殊方法。该页面摘录(我的斜体):
datetime.datetime
也是一个不可变类型。PS 如果您认为:
__init__
,只有__new__
那么请尝试:
Please read the Python reference on Data model, especially about the
__new__
special method.Excerpt from that page (my italics):
datetime.datetime
is also an immutable type.PS If you think that:
__init__
doesn't get called for C implemented objects, only__new__
then please try it:
这是答案和可能的解决方案(使用函数或 strptime 而不是子类化)
http://www.mail-archive.com/[电子邮件受保护]/msg192783.html
Here's the answer, and a possible solution (use a function or strptime instead of subclassing)
http://www.mail-archive.com/[email protected]/msg192783.html
你的功能没有被绕过; Python 只是永远不会到达它会调用它的地步。 由于 datetime 是用 C 实现的,因此它在
datetime.__new__
而不是datetime.__init__
中进行初始化。 这是因为日期时间是不可变的。 您可能可以通过覆盖__new__
而不是__init__
来解决这个问题。 但正如其他人所建议的,最好的方法可能根本不是对日期时间进行子类化。You're function isn't being bypassed; Python just never gets to the point where it would call it. Since datetime is implemented in C, it does its initialization in
datetime.__new__
notdatetime.__init__
. This is because datetime is immutable. You could presumably get around this by overriding__new__
instead of__init__
. But as other people have suggested, the best way is probably not subclassing datetime at all.您可以包装它并向包装器添加扩展功能。
下面是一个示例:
下面是它的工作原理:
请注意,
dir()
不会列出datetime.date
的属性。You can wrap it and add extended functionality to your wrapper.
Here is an example:
And here is how it works:
Note that
dir()
doesn't listdatetime.date
s attributes.您可能应该使用工厂函数而不是创建子类:
You should probably use a factory function instead of creating a subclass: