Python论坛  - 讨论区

标题:[python-chinese] 哪位大哥知道type 与class 的区别?

2007年03月08日 星期四 10:31

shhgs shhgs.efhilt在gmail.com
星期四 三月 8 10:31:39 HKT 2007

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
>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月08日 星期四 10:44

Zoom.Quiet zoom.quiet在gmail.com
星期四 三月 8 10:44:23 HKT 2007

好哪!道理不辨不明的,看的精彩,整理到维基中:
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.
'''

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月08日 星期四 10:45

yi huang yi.codeplayer在gmail.com
星期四 三月 8 10:45:44 HKT 2007

>
> 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 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月08日 星期四 11:04

yi huang yi.codeplayer在gmail.com
星期四 三月 8 11:04:05 HKT 2007

>
> 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 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月08日 星期四 11:43

ygao ygao2004在gmail.com
星期四 三月 8 11:43:24 HKT 2007

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 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月08日 星期四 12:07

ygao ygao2004在gmail.com
星期四 三月 8 12:07:07 HKT 2007

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 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月08日 星期四 12:38

shhgs shhgs.efhilt在gmail.com
星期四 三月 8 12:38:53 HKT 2007

-----------------------------------------
    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
>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月09日 星期五 15:03

Marco marco在waven.com
星期五 三月 9 15:03:23 HKT 2007

能不能告诉我彻底理解这个东西对 使用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

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月09日 星期五 19:53

limodou limodou在gmail.com
星期五 三月 9 19:53:35 HKT 2007

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

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月09日 星期五 20:32

yi huang yi.codeplayer在gmail.com
星期五 三月 9 20:32:19 HKT 2007

>
> 能不能告诉我彻底理解这个东西对 使用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 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月09日 星期五 20:33

yi huang yi.codeplayer在gmail.com
星期五 三月 9 20:33:39 HKT 2007

>
> 能不能告诉我彻底理解这个东西对 使用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 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月09日 星期五 20:40

limodou limodou在gmail.com
星期五 三月 9 20:40:31 HKT 2007

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

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月09日 星期五 20:48

Marco marco在waven.com
星期五 三月 9 20:48:03 HKT 2007

我想也是,除非去开发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

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月10日 星期六 00:50

Linker Lin linker.m.lin在gmail.com
星期六 三月 10 00:50:19 HKT 2007

我觉得在微词大意上做文章会让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 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月10日 星期六 01:39

yi huang yi.codeplayer在gmail.com
星期六 三月 10 01:39:34 HKT 2007

>
> 我觉得在微词大意上做文章会让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 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号