2014年4月12日星期六

从一段代码开始

一段神奇的代码

前一段时间写下了一段代码:

# 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__的调用是一前一后的并列关系,而非是嵌套调用,而且两者使用相同的参数列表。


@LYC
转载请注明出处

0 评论:

发表评论