|
Size: 426
Comment:
|
Size: 6655
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
1. 讨论
持续中....
1.1. 问题
Class 和 Type 在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 吗?我想这种区分没有什么意义。
总之把所有东西都当做对象来看就好了,而类型是个相对的概念,类型对于它实例来说是类型,对于他的类型来说是实例! }}}
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]'"这篇文章讲得非常详
细,推荐阅读。
1.2.1. shhgs <[email protected]>
Mar 7, 2007 2:07 PM
