class Foo:
pass
foo = Foo()
print type(Foo), foo.__class__, Foo.__bases__, isinstance(foo, type)
class Bar(object):
pass
bar = Bar()
print type(Bar), bar.__class__, Bar.__bases__, isinstance(bar, type)
返回结果为
<type 'classobj'> __main__.Foo () False
<type 'type'> <class '__main__.Bar'> (<type 'object'>,) False
上面的代码中Foo为古典类型,而Bar为新式类。新式类要求继承自object或者内建类型。事实上,内置类型也都继承自object
print int.__bases__ #(<type 'object'>,)
print type.__bases__ #(<type 'object'>,)
元类
古典类的元类为types.ClassType, 而新式类的元类为type
print bar.__class__.__class__ #<type 'type'>
__init__()不是构造方法
class Foo(object):
def __new__(cls, *args, **kwargs):
print cls
print args
print kwargs
instance = object.__new__(cls, *args, **kwargs)
print instance
def __init__(self, a, b):
print "init gets called"
print "self is", self
self.a, self.b = a,b
foo = Foo(1,2)
我们注意到,__init__()方法并没有被调用。
事实上__new__()方法才是真正的构造函数。而且__new__()是类方法,一般会返回对象实例。而__init__()是实例方法,只有当__new__()方法返回实例对象之后才会被调用,对这个实例对象进行初始化工作。
一般情况下,我们不需要覆盖__new__()方法,但是当子类继承自不可变类型时,往往要覆盖这个方法。
网友评论