一段神奇的代码
前一段时间写下了一段代码:
# coding: UTF-8
# Name: 神奇的代码
# Author: LYC
# Created: 2014-03-27
import decimal
class Element(decimal.Decimal):
def __init__(self, val, *arg):
super(Element, self).__init__()
print arg
# out:(2, 3, 4)
def __new__(cls, val, *arg):
r = decimal.Decimal.__new__(cls, val)
return r
e = Element(1,2,3,4)
本来以为会是个空输出,事实上却输出了(2, 3, 4)
,吓了一跳。
窃以为__init__
的调用时机是在base.__new__
中被调用,按这样的理解,是万万不可能得出了这样的结果的。通过得到两个arg
的id,发现id都是一样的。
这是什么情况?
# coding: UTF-8
# Name: 神奇的代码
# Author: LYC
# Created: 2014-03-27
import decimal
class Element(decimal.Decimal):
def __init__(self, val, *arg):
print 3
super(Element, self).__init__()
print 4
def __new__(cls, val, *arg):
print 1
r = decimal.Decimal.__new__(cls, val)
print 2
return r
e = Element(1,2,3,4)
基于求知的心态我对代码做了以上改动,发现最终输出的是1,2,3,4
,而非我认为的1,3,4,2
。
因此我们可以得出结论,事实上__new__
和__init__
的调用是一前一后的并列关系,而非是嵌套调用,而且两者使用相同的参数列表。
0 评论:
发表评论