首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

【python】哪位大侠给解释一上这个例子,关于_new_

2012-12-15 
【python】哪位大侠给解释一下这个例子,关于__new__class A(object):def __new__(cls, *args, **kwds):print

【python】哪位大侠给解释一下这个例子,关于__new__

class A(object):
  def __new__(cls, *args, **kwds):
    print "one"
    print "A.__new__", args, kwds
    return object.__new__(B, *args, **kwds)
  def __init__(cls, *args, **kwds):
    print "two"
    print "A.__init__", args, kwds
class B(object):
  def __new__(cls, *args, **kwds):
    print "three"
    print cls
    print B
    print "B.__new__", args, kwds
    return object.__new__(cls, *args, **kwds)
  def __init__(cls, *args, **kwds):
    print "four"
    print "B.__init__", args, kwds

print A()
print "====================="
print B()

我的问题是:
为什么    return object.__new__(B, *args, **kwds) 没有输出
return object.__new__(cls, *args, **kwds)
会返回B的实例。
object.__new__这个东西到底是什么?
[最优解释]
之前是看懂了, 现在又忘了, 说明我根本用不到__new__。
[其他解释]
随便改了一个字母。
class A(object):
  def __new__(cls, *args, **kwds):
    print "one"
    print "A.__new__", args, kwds
    return object.__new__(B, *args, **kwds)
  def __init__(cls, *args, **kwds):
    print "two"
    print "A.__init__", args, kwds
class B(A):
  def __new__(cls, *args, **kwds):
    print "three"
    print cls
    print B
    print "B.__new__", args, kwds
    return A.__new__(cls, *args, **kwds)
  def __init__(cls, *args, **kwds):
    print "four"
    print "B.__init__", args, kwds

print A()
print "====================="
print B()

结果更奇葩了。小弟愚钝 搞不定了。。。
[其他解释]
又改了一下
class A(object):
  def __new__(cls, *args, **kwds):
    print "one"
    print "A.__new__", args, kwds
##    return object.__new__(B, *args, **kwds)
  def __init__(cls, *args, **kwds):
    print "two"
    print "A.__init__", args, kwds
class B(A):
  def __new__(cls, *args, **kwds):
    print "three"
    print cls
    print B
    print "B.__new__", args, kwds
    return A.__new__(cls, *args, **kwds)
  def __init__(cls, *args, **kwds):
    print "four"
    print "B.__init__", args, kwds



print A()
print "====================="
print B()


忽然发现 
>>> object.__new__(B)
<__main__.B object at 0x028646B0>
>>> object.__new__(A)
<__main__.A object at 0x02864C30>
也就是说new会迭代找父类的new(如果没一个new都return super(currentcls,cls)最后返回的 最开始调用的那个类的实例) 
[其他解释]
>>> object.__new__(B)
<__main__.B object at 0x028646B0>
>>> object.__new__(A)
<__main__.A object at 0x02864C30>
为什么会这样呢?
[其他解释]
引用:
之前是看懂了, 现在又忘了, 说明我根本用不到__new__。

原来是这样,那我也不弄了 反正就是个爱好。
感谢你回帖 我终于可以结贴了!

热点排行