object

2016-09-22  本文已影响18人  bigtom
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__()方法,但是当子类继承自不可变类型时,往往要覆盖这个方法。

上一篇下一篇

猜你喜欢

热点阅读