Differences between revisions 1 and 3 (spanning 2 versions)
Revision 1 as of 2007-03-08 02:28:26
Size: 426
Editor: ZoomQuiet
Comment:
Revision 3 as of 2007-03-08 02:35:38
Size: 6655
Editor: ZoomQuiet
Comment:
Deletions are marked like this. Additions are marked like this.
Line 14: Line 14:
'''Class''' 和 '''Type''' 在Py 中有什么区别?
Line 16: Line 17:
 * `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 吗?我想这种区分没有什么意义。

总之把所有东西都当做对象来看就好了,而类型是个相对的概念,类型对于它实例来说是类型,对于他的类型来说是实例!
}}}
 * `Leira Hua <[email protected]>;Mar 7, 2007 5:15 PM`
  * 关于type和class的差别,"'[http://www.cafepy.com/article/python_types_and_objects Python Types and Objects]'"这篇文章讲得非常详
细,推荐阅读。

=== shhgs <[email protected]> ===
 * `Mar 7, 2007 2:07 PM`{{{class和type的区别

打一个比方。在学OO的时候,老师会说,class就是一个模子,往里面浇铁水之后,就有了对象了。

OK,这里就有问题了。你写的代码,相当于工程师设计的图纸,而图纸是没有办法往里面浇铁水的,你得把图纸变成模子,才能往里面浇东西。

于是,你写的代码,定义了一个算法。这个算法别称为class。

你的class,交给type,type根据你的class,加工出一个模子,然后你就可以往里面浇铁水生成instance了。这个type就类似于工厂的生产能力,工艺流程,或者。。。在编程的时候,这个type是语言的一种机制,能把你用代码定义的算法,也就是class,解释成能生成object,或者说instance(其实这个术语更好)的一种object(在解释meta
programming的时候,一定要区分instance和object。这也是为什么,我曾经宣称,OOP应该是面向客体的编程。)。

OK,Py的type有很多,你import
types然后dir(types)可以看到很多。具体而言,每种type都是一种组织内存的方式。比如说,Python内部表示类的对象,同表示instance的对象,其内部构造是不同的。那么这个内部构造是怎么定义的呢?就是这个type定义的。比如,每个instance都应该有一个dict,有表示其parent的tuple,此外还有初始化的时候,生成的parent类的对象(这部分具体应该问Robert
Chen,我菜了)。而class里面可能就没有这么些东西。反正这就是type定义的。

接下来的东西,你可以去看Py in a
nutshell了。Alex把福尔摩斯推理的最重要的一页给撕了。我也是琢磨了半天,最后在看Programming
Ruby的时候搞懂的。现在给你补齐,应该能看懂了。
}}}

 * `Mar 7, 2007 10:13 PM`
type和class绝对不同。

Python里面的所有对象,都是由type制造的。相应的type制造一个blanket的对象,然后解释器再根据你的源代码,往这个blanket的对象里面塞东西。

空白的class object是由types.ClassType或者types.TypeType创建的。而你写的代码,会先在一个dict里面运行,然后塞进这个blanket的class
object里面。
{{{
>>> code = """
def func(self) :
       print "blah, blah, blah"
"""
>>> d = dict()
>>> exec(code, d)

>>> import types
>>> old_class = types.ClassType("OldClass", (), d)
>>> o = old_class()
>>> o.func()
blah, blah, blah

>>> new_class = types.TypeType("NewClass", (), d)
>>> o = new_class()
>>> o.func()
blah, blah, blah
}}}
  * instance一一样。先由types.InstanceType创建一个blanket的instance。在new
  * class里面,这一步可以通过__new__控制。而所谓的meta
  * programming正是在这个__new__里面搞花样。blanket的instance创建完毕,再把dict绑定过去。这样,一个instance就有了。

 * `Mar 7, 2007 11:56 PM`{{{OK, class和type有不同的理解。我这里先解释一下我的定义。

class是指你源代码里面

----------------------------------
class MyClass :
   def blah() :
       ........
----------------------------------

用这种语法定义的类。

而type是指

-------------------------------------
>>> import types
>>> dir(types)
..................
-------------------------------------

你看到的这些东西。

这两者截然不同。他们之间的关系,我用如下一个比喻解释。

你是一个工程师。你现在设计一个很复杂的系统,里面用到了OOP的解决方案。你定义了各种对象,然后让他们相互传消息解决问题。

但是你只是在图纸上设计了这些对象,定义了它们的接口。你不能直接往图纸里浇铁水,你得有模子。

OK,你拿着图纸,找到一家叫Py的工厂。这个工厂拿到图纸之后说,没问题,我给你造。于是它根据图纸造一个模子(class
object)。制造模子的时候,工厂用的是自己的生产工具(types.ClassType,或者tpyes.TypeType,看你用new
class还是old class)。

但是光有模子没用,你要的是解决问题,你得让工厂再按照你的图纸生产处一些能收发消息的对象。

Py工厂说,没问题,有了模子还愁instance吗。只是我们的模子只能我们自己用。于是它再备料。这次出场的是InstanceType。你可以把InstanceType想成一种类似塑料一样的东西。原本你以为工厂是会往模子里浇铁水的,结果它的模子只能浇这种塑料。Anyway,东西做出来了,也能收发消息了,你就能让程序跑起来解决问题了。
}}}

[http://groups.google.com/group/python-cn/browse_thread/thread/e18f109622b2ef76 哪位大哥知道type 与class 的区别?] -- 引发的深入理解 ::-- ZoomQuiet [DateTime(2007-03-08T02:28:26Z)] TableOfContents

Include(CPUGnav)

1. 讨论

持续中....

1.1. 问题

ClassType 在Py 中有什么区别?

1.2. 理解

  • 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 吗?我想这种区分没有什么意义。

总之把所有东西都当做对象来看就好了,而类型是个相对的概念,类型对于它实例来说是类型,对于他的类型来说是实例! }}}

细,推荐阅读。

1.2.1. shhgs <[email protected]>

  • Mar 7, 2007 2:07 PM

PyClassAndType (last edited 2009-12-25 07:16:35 by localhost)