2007年03月08日 星期四 10:31
Py的type是不能自定义的。你只能继承已有的types里面的type。要想自定义一个type,比如像Perl, Ruby那样,用1..3表示一个Range,你就得用C。从这个角度来讲,不管new还是old的class,都不是type。 你前面写的,class int(object)是笔误。我还以为可以这样继承int了。MyInt虽然继承了int,但是看不出有什么用。其实Python的meta programming也就type有用。 new class object的type其实还是object。这个肯定是不错的。object是所有object的base type。其实new class object在初始化的时候,采用的方式同old class的大同小异。都是调用 一个方法,生成一个blanket的instance,然后往里面塞东西。所不同的是,old class用的是InstanceType,而new class用的是class object的__new__方法。 Python 2.2之前的OO实现还是很清楚的,现在这个实现,思路很混乱。主要是为了要过渡到Py 3000。这个type和object之间的鸡和蛋的关系实在同Py的优雅不沾边。Py 3000取消了type之后,meta programming应该更容易了。 On 3/7/07, yi huang <yi.codeplayer在gmail.com> wrote: > > class int(object): > > ............ > > > > 这个我极感兴趣。写一个能运行的代码,然后提供一个times方 > > 法,能返回一个iterator,像ruby的Fixnum#times那样就行了。 > > >>> class MyInt(int): > ... def times(self, func): > ... for i in range(self): > ... func() > ... > >>> def test():print 'hello' > ... > >>> a = MyInt(3) > >>> a.times(test) > hello > hello > hello > > 只不过不能直接给内置类型加属性(等于是内置类型使用了 __slots__),所以并不能达到 3.times(test) 的效果。 > > -- > http://codeplayer.blogspot.com/ > _______________________________________________ > python-chinese > Post: send python-chinese在lists.python.cn > Subscribe: send subscribe to > python-chinese-request在lists.python.cn > Unsubscribe: send unsubscribe to > python-chinese-request在lists.python.cn > Detail Info: > http://python.cn/mailman/listinfo/python-chinese >
2007年03月08日 星期四 10:44
好哪!道理不辨不明的,看的精彩,整理到维基中: http://wiki.woodpecker.org.cn/moin/PyClassAndType 题外思考: http://www.nirvanastudio.org/category/scheme/ 如同此文展示的,非语法自定义的语言本身,是受设计者思想限制的, 我们必须深入理解其特性,以便 Think in XXX 才可能晋升大家, 而不是象Lisp 等等古老的原语化的语言,是Make XXX Think like XXX 嗬嗬嗬……………… On 3/8/07, shhgs <shhgs.efhilt在gmail.com> wrote: > Py的type是不能自定义的。你只能继承已有的types里面的type。要想自定义一个type,比如像Perl, > Ruby那样,用1..3表示一个Range,你就得用C。从这个角度来讲,不管new还是old的class,都不是type。 > > 你前面写的,class int(object)是笔误。我还以为可以这样继承int了。MyInt虽然继承了int,但是看不出有什么用。其实Python的meta > programming也就type有用。 > > new class object的type其实还是object。这个肯定是不错的。object是所有object的base > type。其实new class object在初始化的时候,采用的方式同old class的大同小异。都是调用 > 一个方法,生成一个blanket的instance,然后往里面塞东西。所不同的是,old class用的是InstanceType,而new > class用的是class object的__new__方法。 > > Python 2.2之前的OO实现还是很清楚的,现在这个实现,思路很混乱。主要是为了要过渡到Py > 3000。这个type和object之间的鸡和蛋的关系实在同Py的优雅不沾边。Py 3000取消了type之后,meta > programming应该更容易了。 > > > > > On 3/7/07, yi huang <yi.codeplayer在gmail.com> wrote: > > > class int(object): > > > ............ > > > > > > 这个我极感兴趣。写一个能运行的代码,然后提供一个times方 > > > 法,能返回一个iterator,像ruby的Fixnum#times那样就行了。 > > > > >>> class MyInt(int): > > ... def times(self, func): > > ... for i in range(self): > > ... func() > > ... > > >>> def test():print 'hello' > > ... > > >>> a = MyInt(3) > > >>> a.times(test) > > hello > > hello > > hello > > > > 只不过不能直接给内置类型加属性(等于是内置类型使用了 __slots__),所以并不能达到 3.times(test) 的效果。 > > > > -- > > http://codeplayer.blogspot.com/ > > _______________________________________________ > > python-chinese > > Post: send python-chinese在lists.python.cn > > Subscribe: send subscribe to > > python-chinese-request在lists.python.cn > > Unsubscribe: send unsubscribe to > > python-chinese-request在lists.python.cn > > Detail Info: > > http://python.cn/mailman/listinfo/python-chinese > > > _______________________________________________ > python-chinese > Post: send python-chinese在lists.python.cn > Subscribe: send subscribe to python-chinese-request在lists.python.cn > Unsubscribe: send unsubscribe to python-chinese-request在lists.python.cn > Detail Info: http://python.cn/mailman/listinfo/python-chinese -- '''Time is unimportant, only life important! http://zoomquiet.org blog在http://blog.zoomquiet.org/pyblosxom/ wiki在http://wiki.woodpecker.org.cn/moin/ZoomQuiet scrap在http://floss.zoomquiet.org douban在http://www.douban.com/people/zoomq/ ____________________________________ Pls. use OpenOffice.org to replace M$ Office. http://zh.openoffice.org Pls. use 7-zip to replace WinRAR/WinZip. http://7-zip.org/zh-cn/ You can get the truely Freedom 4 software. '''
2007年03月08日 星期四 10:45
> > Py的type是不能自定义的。你只能继承已有的types里面的type。要想自定义一个type,比如像Perl, > Ruby那样,用1..3表示一个Range,你就得用C。从这个角度来讲,不管new还是old的class,都不是type。 > 所有类型,不管内置的类型还是自定义的类型,都是继承自object。 要用 1..3 来表示一个 Range,这只是个语法而已,并不是一个新类型,我想这除非修改python的实现。 其实new class object在初始化的时候,采用的方式同old class的大同小异。都是调用 > 一个方法,生成一个blanket的instance,然后往里面塞东西。 > 可以说所有语言都是如此,包括 c++ 也是,先分配一片内存空间,然后初始化这片内存。 -- http://codeplayer.blogspot.com/ -------------- next part -------------- An HTML attachment was scrubbed... URL: http://python.cn/pipermail/python-chinese/attachments/20070308/eba49d5e/attachment.html
2007年03月08日 星期四 11:04
> > Python 2.2之前的OO实现还是很清楚的,现在这个实现,思路很混乱。主要是为了要过渡到Py > 3000。这个type和object之间的鸡和蛋的关系实在同Py的优雅不沾边。Py 3000取消了type之后,meta > programming应该更容易了。 > 现在只是同时存在着 old-style class 和 new-style class 两种,而我说的话基本上都只站在 new-style class 的立场讲的。 至于 type 于 object 之间的关系: >>> issubclass(type, object) True >>> issubclass(object, object) True >>> isinstance(object, type) True >>> isinstance(type, type) True 另外 1, [], {'a':1,'b':2} 这些只是语法,他们分别产生 int, list, dict 的实例。 语言的语法对基本类型提供直接的支持,我像这是让这些基本类型显得特殊的原因。 -- http://codeplayer.blogspot.com/ -------------- next part -------------- An HTML attachment was scrubbed... URL: http://python.cn/pipermail/python-chinese/attachments/20070308/10df5385/attachment.html
2007年03月08日 星期四 11:43
On 3/7/07, yi huang <yi.codeplayer在gmail.com> wrote: > > 没区别。 太极端! >>> type(object) is type(type) True >>> object is type False 任何class都得从type承继。 > -- > http://codeplayer.blogspot.com/ > _______________________________________________ > python-chinese > Post: send python-chinese在lists.python.cn > Subscribe: send subscribe to python-chinese-request在lists.python.cn > Unsubscribe: send unsubscribe to python-chinese-request在lists.python.cn > Detail Info: http://python.cn/mailman/listinfo/python-chinese > -- ※※※※※※※※※※※※※※※※※※※※※※※※ My blog: http://blog.donews.com/ygao Forum http://groups.google.com/group/python_study ※※※※※※※※※※※※※※※※※※※※※※※※ -------------- 下一部分 -------------- 一个HTML附件被移除... URL: http://python.cn/pipermail/python-chinese/attachments/20070308/651b70b7/attachment.html
2007年03月08日 星期四 12:07
On 3/8/07, ygao <ygao2004在gmail.com> wrote: > > > > On 3/7/07, yi huang <yi.codeplayer在gmail.com> wrote: > > > > 没区别。 > > > 太极端! > >>> type(object) is type(type) > True > >>> object is type > False > > > 误: 任何class都得从object继承。 > > > > > -- > > http://codeplayer.blogspot.com/ > > _______________________________________________ > > python-chinese > > Post: send python-chinese在lists.python.cn > > Subscribe: send subscribe to python-chinese-request在lists.python.cn > > Unsubscribe: send unsubscribe to python-chinese-request在lists.python.cn > > Detail Info: http://python.cn/mailman/listinfo/python-chinese > > > > > > -- > ※※※※※※※※※※※※※※※※※※※※※※※※ > My blog: http://blog.donews.com/ygao > Forum http://groups.google.com/group/python_study > ※※※※※※※※※※※※※※※※※※※※※※※※ -- ※※※※※※※※※※※※※※※※※※※※※※※※ My blog: http://blog.donews.com/ygao Forum http://groups.google.com/group/python_study ※※※※※※※※※※※※※※※※※※※※※※※※ -------------- 下一部分 -------------- 一个HTML附件被移除... URL: http://python.cn/pipermail/python-chinese/attachments/20070308/30551849/attachment.htm
2007年03月08日 星期四 12:38
----------------------------------------- Py的type是不能自定义的。你只能继承已有的types里面 的type。要想自定义一个type,比如像Perl, Ruby那样,用1..3表示一个Range,你就得用C。从这个角度来讲,不管new还是old的class,都不是type。 所有类型,不管内置的类型还是自定义的类型,都是继承自object。 要用 1..3 来表示一个 Range,这只是个语法而已,并不是一个新类型,我想这除非修改python的实现。 其实new class object在初始化的时候,采用的方式同old class的大同小异。都是调用 一个方法,生成一个blanket的instance ,然后往里面塞东西。 可以说所有语言都是如此,包括 c++ 也是,先分配一片内存空间,然后初始化这片内存。 ----------------------------------------- 但是 class是可以自己定义的。所以class和type还是不一样的。 On 3/7/07, yi huang <yi.codeplayer在gmail.com> wrote: > > > Py的type是不能自定义的。你只能继承已有的types里面 > > 的type。要想自定义一个type,比如像Perl, > > > Ruby那样,用1..3表示一个Range,你就得用C。从这个角度来讲,不管new还是old的class,都不是type。 > > 所有类型,不管内置的类型还是自定义的类型,都是继承自object。 > 要用 1..3 来表示一个 Range,这只是个语法而已,并不是一个新类型,我想这除非修改python的实现。 > > > 其实new class object在初始化的时候,采用的方式同old class的大同小异。都是调用 > > 一个方法,生成一个blanket的instance > > ,然后往里面塞东西。 > > 可以说所有语言都是如此,包括 c++ 也是,先分配一片内存空间,然后初始化这片内存。 > > -- > http://codeplayer.blogspot.com/ > _______________________________________________ > python-chinese > Post: send python-chinese在lists.python.cn > Subscribe: send subscribe to > python-chinese-request在lists.python.cn > Unsubscribe: send unsubscribe to > python-chinese-request在lists.python.cn > Detail Info: > http://python.cn/mailman/listinfo/python-chinese >
2007年03月09日 星期五 15:03
能不能告诉我彻底理解这个东西对 使用python有啥好处吗? 谢谢! On 3/8/07, shhgs <shhgs.efhilt在gmail.com> wrote: > ----------------------------------------- > Py的type是不能自定义的。你只能继承已有的types里面 > 的type。要想自定义一个type,比如像Perl, > Ruby那样,用1..3表示一个Range,你就得用C。从这个角度来讲,不管new还是old的class,都不是type。 > > > 所有类型,不管内置的类型还是自定义的类型,都是继承自object。 > 要用 1..3 来表示一个 Range,这只是个语法而已,并不是一个新类型,我想这除非修改python的实现。 > > 其实new class object在初始化的时候,采用的方式同old class的大同小异。都是调用 > 一个方法,生成一个blanket的instance > ,然后往里面塞东西。 > > > 可以说所有语言都是如此,包括 c++ 也是,先分配一片内存空间,然后初始化这片内存。 > ----------------------------------------- > > > 但是 class是可以自己定义的。所以class和type还是不一样的。 > > > On 3/7/07, yi huang <yi.codeplayer在gmail.com> wrote: > > > > > Py的type是不能自定义的。你只能继承已有的types里面 > > > 的type。要想自定义一个type,比如像Perl, > > > > > Ruby那样,用1..3表示一个Range,你就得用C。从这个角度来讲,不管new还是old的class,都不是type。 > > > > 所有类型,不管内置的类型还是自定义的类型,都是继承自object。 > > 要用 1..3 来表示一个 Range,这只是个语法而已,并不是一个新类型,我想这除非修改python的实现。 > > > > > 其实new class object在初始化的时候,采用的方式同old class的大同小异。都是调用 > > > 一个方法,生成一个blanket的instance > > > ,然后往里面塞东西。 > > > > 可以说所有语言都是如此,包括 c++ 也是,先分配一片内存空间,然后初始化这片内存。 > > > > -- > > http://codeplayer.blogspot.com/ > > _______________________________________________ > > python-chinese > > Post: send python-chinese在lists.python.cn > > Subscribe: send subscribe to > > python-chinese-request在lists.python.cn > > Unsubscribe: send unsubscribe to > > python-chinese-request在lists.python.cn > > Detail Info: > > http://python.cn/mailman/listinfo/python-chinese > > > _______________________________________________ > python-chinese > Post: send python-chinese在lists.python.cn > Subscribe: send subscribe to python-chinese-request在lists.python.cn > Unsubscribe: send unsubscribe to python-chinese-request在lists.python.cn > Detail Info: http://python.cn/mailman/listinfo/python-chinese -- LinuX Power
2007年03月09日 星期五 19:53
On 3/9/07, Marco <marco在waven.com> wrote: > 能不能告诉我彻底理解这个东西对 使用python有啥好处吗? 谢谢! > 目前来说没有什么用,我看只是纯学术研究,知不知道,清楚不清楚对开发影响不大。 -- I like python! UliPad <>: http://wiki.woodpecker.org.cn/moin/UliPad My Blog: http://www.donews.net/limodou
2007年03月09日 星期五 20:32
> > 能不能告诉我彻底理解这个东西对 使用python有啥好处吗? 谢谢! > 我想会用就够了,而怎么理解对于应用来说可能不是特别重要,不过不同的理解在交流的时候会造成许多障碍。比如我和 shhgs ,呵呵。 这问题本来就太抽象,我也觉得争得没啥意思。 要说清楚 type 和 class 是不是一样,不光要先定义 type 和 class,还得定义什么叫做"一样"先。 区别肯定是有的,区别到什么程度算不一样呢? 在某些方面一样,在其他方面又不一样,我想在本质的某些方面一样,就可以算是一样了,但哪些方面算是本质,哪些方面又只是表面呢。。。 -- http://codeplayer.blogspot.com/ -------------- next part -------------- An HTML attachment was scrubbed... URL: http://python.cn/pipermail/python-chinese/attachments/20070309/fc1ea672/attachment.html
2007年03月09日 星期五 20:33
> > 能不能告诉我彻底理解这个东西对 使用python有啥好处吗? 谢谢! > 总滴来说,我觉得会用 metaclass 了就行了。 -- http://codeplayer.blogspot.com/ -------------- next part -------------- An HTML attachment was scrubbed... URL: http://python.cn/pipermail/python-chinese/attachments/20070309/5c15cd66/attachment.html
2007年03月09日 星期五 20:40
On 3/9/07, yi huang <yi.codeplayer在gmail.com> wrote: > > 能不能告诉我彻底理解这个东西对 使用python有啥好处吗? 谢谢! > > > > 总滴来说,我觉得会用 metaclass 了就行了。 > metaclass也不一定需要会用,至少对于初学者不需要,基本的日常编程用到的也不多,对于开发框架功能的用处大一些。 -- I like python! UliPad <>: http://wiki.woodpecker.org.cn/moin/UliPad My Blog: http://www.donews.net/limodou
2007年03月09日 星期五 20:48
我想也是,除非去开发Python本身,而如果真的参与到了python本身的开发,通过阅读python源代码,自然也就知道两者的意思了。 On 3/9/07, limodou <limodou在gmail.com> wrote: > On 3/9/07, yi huang <yi.codeplayer在gmail.com> wrote: > > > 能不能告诉我彻底理解这个东西对 使用python有啥好处吗? 谢谢! > > > > > > > 总滴来说,我觉得会用 metaclass 了就行了。 > > > metaclass也不一定需要会用,至少对于初学者不需要,基本的日常编程用到的也不多,对于开发框架功能的用处大一些。 > > -- > I like python! > UliPad <>: http://wiki.woodpecker.org.cn/moin/UliPad > My Blog: http://www.donews.net/limodou > _______________________________________________ > python-chinese > Post: send python-chinese在lists.python.cn > Subscribe: send subscribe to python-chinese-request在lists.python.cn > Unsubscribe: send unsubscribe to python-chinese-request在lists.python.cn > Detail Info: http://python.cn/mailman/listinfo/python-chinese -- LinuX Power
2007年03月10日 星期六 00:50
我觉得在微词大意上做文章会让Python陷入C++的尴尬境地。 希望Py3000能统一对象模型。 最近看了看Lua,对meta programming有些理解,我认为, python /lua 等脚本没有new 、delete, 因此凡是可以通过 xxx() 获得引用的东西,我们都可以看作是 对象。而不要局限于有类生成的才是对象。 比如用 yield生成的生成器。 def it(): i=0 while(i<10): i+=1 yield i iter=it() iter2=it() print iter.next() print iter.next() print iter.next() print "*"*10 print iter2.next() print iter2.next() print iter2.next() 输出: 1 2 3 ********** 1 2 3 iter和iter2都表现出对象的性质,保存了自己的状态。 这个迭代器是没有类的,但是可以像对象一样保存自己的状态。 如果从C++传统OO思想里面跳出来看,其实只要能够保存私有状态的函数就是对象。 (当然,在C++里面通过仿函数可以模拟yield的部分效果。) 而生成这种东西的东西就叫类。 在更加彻底的meta progamming语言Lua中,设计者根本没有设计类/对像模型,用户通过改写table的特定方法可以更加灵活的实现。 我觉得 C++ 把对象的模具限制死--用类来描述,大大限制了C++类语言的能力,并且不得不引入创建类设计模式来补丁。 对于Python等动态语言,我们大可不必像C++标准委员会的老者们那样在微词大意上做文章。 在我看来, 1. 所有的引用能指引的东西都是对象(广义) 2. 能够生成广义对象的那个东西就是类(广义) 比如,一个对象通过 clone()方法可以得到另一个对象,那么我们为什么不把这个对象看作是类? 在现实世界中模具本身也是对象啊! 所以,有的时候,在分析问题的时候,分类法不如标签法,正如我们用的GMail一样。 On 3/9/07, Marco <marco在waven.com> wrote: > > 我想也是,除非去开发Python本身,而如果真的参与到了python本身的开发,通过阅读python源代码,自然也就知道两者的意思了。 > > On 3/9/07, limodou <limodou在gmail.com> wrote: > > On 3/9/07, yi huang <yi.codeplayer在gmail.com> wrote: > > > > 能不能告诉我彻底理解这个东西对 使用python有啥好处吗? 谢谢! > > > > > > > > > > 总滴来说,我觉得会用 metaclass 了就行了。 > > > > > metaclass也不一定需要会用,至少对于初学者不需要,基本的日常编程用到的也不多,对于开发框架功能的用处大一些。 > > > > -- > > I like python! > > UliPad <>: http://wiki.woodpecker.org.cn/moin/UliPad > > My Blog: http://www.donews.net/limodou > > _______________________________________________ > > python-chinese > > Post: send python-chinese在lists.python.cn > > Subscribe: send subscribe to python-chinese-request在lists.python.cn > > Unsubscribe: send unsubscribe to python-chinese-request在lists.python.cn > > Detail Info: http://python.cn/mailman/listinfo/python-chinese > > > -- > LinuX Power > _______________________________________________ > python-chinese > Post: send python-chinese在lists.python.cn > Subscribe: send subscribe to python-chinese-request在lists.python.cn > Unsubscribe: send unsubscribe to python-chinese-request在lists.python.cn > Detail Info: http://python.cn/mailman/listinfo/python-chinese -- Linker M Lin linker.m.lin在gmail.com -------------- 下一部分 -------------- 一个HTML附件被移除... URL: http://python.cn/pipermail/python-chinese/attachments/20070310/1d8b7c46/attachment-0001.html
2007年03月10日 星期六 01:39
> > 我觉得在微词大意上做文章会让Python陷入C++的尴尬境地。 > 希望Py3000能统一对象模型。 > 最近看了看Lua,对meta programming有些理解,我认为, > > python /lua 等脚本没有new 、delete, 因此凡是可以通过 xxx() 获得引用的东西,我们都可以看作是 > 对象。而不要局限于有类生成的才是对象。 > 比如用 yield生成的生成器。 > > def it(): > i=0 > while(i<10): > i+=1 > yield i > > iter=it() > iter2=it() > print iter.next() > print iter.next() > print iter.next() > print "*"*10 > print iter2.next() > print iter2.next () > print iter2.next() > 输出: > 1 > 2 > 3 > ********** > 1 > 2 > 3 > > iter和iter2都表现出对象的性质,保存了自己的状态。 > 这个迭代器是没有类的,但是可以像对象一样保存自己的状态。 > 如果从C++传统OO思想里面跳出来看,其实只要能够保存私有状态的函数就是对象。 > (当然,在C++里面通过仿函数可以模拟yield的部分效果。) > 而生成这种东西的东西就叫类。 > 在更加彻底的meta progamming语言Lua中,设计者根本没有设计类/对像模型,用户通过改写table的特定方法可以更加灵活的实现。 > > 我觉得 C++ 把对象的模具限制死--用类来描述,大大限制了C++类语言的能力,并且不得不引入创建类设计模式来补丁。 > > 对于Python等动态语言,我们大可不必像C++标准委员会的老者们那样在微词大意上做文章。 > 在我看来, > 1. 所有的引用能指引的东西都是对象(广义) > 2. 能够生成广义对象的那个东西就是类(广义) > > 比如,一个对象通过 clone()方法可以得到另一个对象,那么我们为什么不把这个对象看作是类? > > 在现实世界中模具本身也是对象啊! > > 所以,有的时候,在分析问题的时候,分类法不如标签法,正如我们用的GMail一样。 python中任何东西都是对象,任何对象都有他的"类",或者说类型。generator 当然也有他的类。 >>> def test(): ... yield 1 ... >>> g = test() >>> g>>> g.__class__ 至于 c++ 这种语言,和 python/lua 这种语言还是有太大的区别的。 好晚了,要睡觉去了。 -- http://codeplayer.blogspot.com/ -------------- next part -------------- An HTML attachment was scrubbed... URL: http://python.cn/pipermail/python-chinese/attachments/20070310/0b7b1014/attachment.html
Zeuux © 2025
京ICP备05028076号