yi huang <[email protected]>

  • Mar 7, 2007 2:51 PM

    把 class 比喻成 模子 在c++这样的语言里面比较合适,因为那里 class 确实只是编译时用来创建对象的一个模子,在运行时没有任何作用。 
    但是 python 里面 class 也是一个实实在在的对象,他还也有他的类型。
    我们应该把所有东西都理解成为对象,对象之间有一种关系叫实例化。
    所谓类型是相对而言的,一个对象可以其他对象的类型,同时又是另一个对象的实例。
    
    types 里面只是一些内置的类型而已。
    
    总之 type 和 class 之间到底有没有区别首先得定义这两个概念先,如果说内置类型为 type ,通过 class 语句定义自定义类型为 class 的话,他们当然是有区别的,但这样的定义没有什么意义,因为自定义的类型也可以继承内置的类型,比如:
    class MyList(list):pass
    难道 MyList 是 class,list 就是 type 吗?我想这种区分没有什么意义。
    
    总之把所有东西都当做对象来看就好了,而类型是个相对的概念,类型对于它实例来说是类型,对于他的类型来说是实例!
    
  • Mar 8, 2007 8:55 AM

    你看下 types.py 的内容就知道 types 里面的东西是怎么来的了。 
    
    >>> import types
    >>> class A:pass
    ...
    >>> type(A) == types.ClassType
    True
    >>> a = A()
    >>> type(a) == types.InstanceType
    True
    >>> class A(object):pass
    ...
    >>> type(A) == type == types.TypeType
    True
    >>> a = A()
    >>> type(a) == A
    True
    
    我不知道这里你对 type 的定义是什么,如果是指 types 模块里面的那些内置的类型的话,那他们和用户自己定义的类型当然是不同的。不过 python2.2 之后内置类型与自定义类型之间已经没有什么区别,内置类型也可以被继承等。
    
    >>> class MetaClass(type):pass
    ...
    >>> class Klass(object):
    ...     __metaclass__ = MetaClass
    ...
    >>> obj = Klass()
    >>> type(obj) == Klass
    True
    >>> type(Klass) == MetaClass
    True
    
    这里 Klass 的 metaclass 不是 type 而是 MetaClass,Klass 实际上等于 MetaClass('Klass', (object, ), {}) ,你说这里的 MetaClass 算 class 还是 type 呢?
    
    __new__ 是用来生成 class 的实例的时候被调用,而 metaclass 是用来生成 class 。
    meta programming 范围很广,似乎一般定义是说编写把代码当数据操纵的代码。
    
  • Mar 8, 2007 9:23 AM

    我想你是在拿 old-style class 说事,types.ClassType 和 types.InstanceType 都是以前的东西了。 
    
    class A(object):
        pass
    a = A()
    
    这里 A 是 new-style class,type(a) 是 A, 而不是 types.InstanceType 。
    
    按照你这里对 type 和 class 的定义,实际上 python2.2 所做的巨大努力,就是为了统一 type 和 class 
    
  • Mar 8, 2007 9:51 AM

    当然可以自定义 type 了,你可以继承那些内置类型。
    我说 type 和 class 没有差别是站在 new-style class 角度来说的。
    我觉得对于初学者,更应该在一开始就拥有正确的观念。
    前面就有人列出了经典文章: http://www.cafepy.com/article/python_types_and_objects/
    
    其实根据:
    
    >>> issubclass(int, object)
    True
    >>> isinstance(int, type)
    True
    
    我们完全可以想象 int 类型的实现:
    
    class int(object):
        ...
    
    而且 int 也可以被继承,实在看不出和普通 class 有什么区别。
    
    另外,types 模块和 new 模块在 py3k 中都将被废弃 (见 pep-0249),那时候内置类型就更没有什么特殊之处了。