__new__
当您在其中创建子类的实例时,作为静态方法允许一个用例:
return super(<currentclass>, cls).__new__(subcls, *args, **kwargs)
如果new
是类方法,那么上面写成:
return super(<currentclass>, cls).new(*args, **kwargs)
而且没有地方放subcls
。
不过,我真的不知道什么时候可以正确使用__new__
. 也许我没有看到它,但在我看来,这完全是对它的病态使用(应该说,如果你仍然真的想要它,那么你可以使用 访问它object.__new__.__func__
)。至少,我很难想象这会是 Guido__new__
从类方法变为静态方法的原因。
更常见的情况是调用 parent__new__
而不使用super()
. 在这种情况下,您需要一个明确通过的地方cls
:
class Base(object):
@classmethod
def new(cls):
print("Base.new(%r)" % (cls,))
return cls()
class UseSuper(Base):
@classmethod
def new(cls):
print("UseSuper.new(%r)" % (cls,))
return super(UseSuper, cls).new() # passes cls as the first arg
class NoSuper(Base):
@classmethod
def new(cls):
print("NoSuper.new(%r)" % (cls,))
return Base.new() # passes Base as the first arg
class UseFunc(Base):
@classmethod
def new(cls):
print("UseFunc.new(%r)" % (cls,))
return Base.new.im_func(cls) # or `.__func__(cls)`. # passes cls as the first arg
print(UseSuper.new())
print('-'*60)
print(NoSuper.new())
print('-'*60)
print(UseFunc.new())