代码之家  ›  专栏  ›  技术社区  ›  Roger Pate

类型(obj)和obj类之间的差异__

  •  37
  • Roger Pate  · 技术社区  · 16 年前

    两者的区别是什么 type(obj) obj.__class__ ? 有没有可能 type(obj) is not obj.__class__ ?

    def f(a, b=None):
      if b is None:
        b = type(a)(1) # #1
        b = a.__class__(1) # #2
    
    3 回复  |  直到 12 年前
        1
  •  65
  •   Flavien    13 年前

    新样式的类可能具有不同的 type(instance) instance.__class__ :

    class ClassA(object):
        def display(self):
            print("ClassA")
    
    class ClassB(object):
        __class__ = ClassA
    
        def display(self):
            print("ClassB")
    
    instance = ClassB()
    
    print(type(instance))
    print(instance.__class__)
    instance.display()
    

    输出:

    <class '__main__.ClassB'>
    <class '__main__.ClassA'>
    ClassB
    

    原因是 ClassB __class__ 描述符,但是对象中的内部类型字段不会更改。 类型(实例) 实例__

        2
  •  32
  •   Alex Martelli    16 年前

    问题出在老式课程上,唉:

    >>> class old: pass
    ... 
    >>> x=old()
    >>> type(x)
    <type 'instance'>
    >>> x.__class__
    <class __main__.old at 0x6a150>
    >>> 
    

    在Python2中,只有从另一个新样式类(包括 object 以及各种内置类型,如 dict , list , set __metaclass__ type .

        3
  •  19
  •   S.Lott    16 年前

    type(obj) type.__class__

    >>> class a(object):
    ...     pass
    ...
    >>> class b(a):
    ...     pass
    ...
    >>> class c:
    ...     pass
    ...
    >>> ai=a()
    >>> bi=b()
    >>> ci=c()
    >>> type(ai) is ai.__class__
    True
    >>> type(bi) is bi.__class__
    True
    >>> type(ci) is ci.__class__
    False