object

作者: bigtom | 来源:发表于2016-09-22 16:01 被阅读18次
    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__()方法,但是当子类继承自不可变类型时,往往要覆盖这个方法。

    相关文章

      网友评论

          本文标题:object

          本文链接:https://www.haomeiwen.com/subject/esuzettx.html