python新式类与旧式类

python中新式类与旧式类,python2才有的问题,python3中所有的类均为新式类.

python2中定义新式类需要继承自object或者其他新式类(因为python3中的所有类都隐式继承自object,所以自然没有这种问题).新式类提供了大量老式类所没有的特性,比如上面的super继承和下’马上要说的__new__.同时新式类的__class__和type(b)返回值完全相同(如ClassB, 都为class ‘__main__.ClassB’),而老式类的type(b)返回值为\<type ‘instance’>.

__new__

如上面所说,这是新式类中所有的特性,在构造方法调用之前调用.如下例:
class Foo(object):
def init(self, args, **kwargs):

def new(cls,
args, kwargs):
return object.new(cls, *args,
kwargs)

# 上面一句调用等同于 return object.__new__(Foo, *args, **kwargs)

在__init__调用之前,__new__会首先调用.参数中的cls为当前正在实例化的类.可以再__new__中选择任意新式类的__new__方法进行调用.但是不能调用自身的__new__方法,这样会陷入无限递归.同样道理,也不能调用有继承关系类的__new__方法.
如果__new__方法没有返回当前类的实例,则__init__方法不会被调用.如下面的代码:
class Foo(object):
def init(self, args, **kwargs):

def new(cls,
args, kwargs):
return object.new(Stranger, *args,
kwargs)

class Stranger(object):
    ...

foo = Foo()

foo实际上是Stranger的实例.