Python论坛  - 讨论区

标题:[python-chinese] django中一个类的定义

2006年11月05日 星期日 13:24

leopay leopay在gmail.com
星期日 十一月 5 13:24:16 HKT 2006

在django/contrib/syndication/feeds.py中:
关于feed类的定义

class Feed(object):
item_pubdate = None
item_enclosure_url = None
feed_type = feedgenerator.DefaultFeed
title_template = None
description_template = None

def __init__(self, slug, feed_url):
self.slug = slug
self.feed_url = feed_url
self.title_template_name = self.title_template or ('feeds/%s_title.html'
% slug)
self.description_template_name = self.description_template or
('feeds/%s_description.html' % slug)


在__init__函数中title_template_name,description_template_name的赋值为什么要
做一下判断,在前面不是已经定义title_template = None了么,
self.title_template_name = self.title_template or ('feeds/%s_title.html'
% slug)不就是
self.title_template_name = 'feeds/%s_title.html' % slug,
为什么还要在or前面判断一下?

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

2006年11月06日 星期一 09:08

limodou limodou在gmail.com
星期一 十一月 6 09:08:26 HKT 2006

On 11/5/06, leopay <leopay在gmail.com> wrote:
> 在django/contrib/syndication/feeds.py中:
> 关于feed类的定义
>
> class Feed(object):
> item_pubdate = None
> item_enclosure_url = None
> feed_type = feedgenerator.DefaultFeed
> title_template = None
> description_template = None
>
> def __init__(self, slug, feed_url):
> self.slug = slug
> self.feed_url = feed_url
> self.title_template_name = self.title_template or ('feeds/%s_title.html'
> % slug)
> self.description_template_name = self.description_template or
> ('feeds/%s_description.html' % slug)
>
>
> 在__init__函数中title_template_name,description_template_name的赋值为什么要
> 做一下判断,在前面不是已经定义title_template = None了么,
> self.title_template_name = self.title_template or ('feeds/%s_title.html'
> % slug)不就是
> self.title_template_name = 'feeds/%s_title.html' % slug,
> 为什么还要在or前面判断一下?

我想这是因为Feed一般是作为基类,真正的处理需要你从它进行派生,因此有可能你在新的子类中就定义了这两个变量,如果你不重载__init__的话,它这样判断比较安全。

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

2006年11月06日 星期一 12:21

大熊 bearsprite在gmail.com
星期一 十一月 6 12:21:22 HKT 2006

子类有可能把这个None改掉了

2006/11/5, leopay <leopay在gmail.com>:
>
> 在django/contrib/syndication/feeds.py中:
> 关于feed类的定义
>
> class Feed(object):
> item_pubdate = None
> item_enclosure_url = None
> feed_type = feedgenerator.DefaultFeed
> title_template = None
> description_template = None
>
> def __init__(self, slug, feed_url):
> self.slug = slug
> self.feed_url = feed_url
> self.title_template_name = self.title_template or ('feeds/%s_title.html'
> % slug)
> self.description_template_name = self.description_template or
> ('feeds/%s_description.html' % slug)
>
>
> 在__init__函数中title_template_name,description_template_name的赋值为什么要
> 做一下判断,在前面不是已经定义title_template = None了么,
> self.title_template_name = self.title_template or ('feeds/%s_title.html'
> % slug)不就是
> self.title_template_name = 'feeds/%s_title.html' % slug,
> 为什么还要在or前面判断一下?
> _______________________________________________
> 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




-- 
茫茫人海,你是我的最爱
-------------- 下一部分 --------------
一个HTML附件被移除...
URL: http://python.cn/pipermail/python-chinese/attachments/20061106/2043b197/attachment.htm 

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

cf

2006年11月06日 星期一 15:28

cai feng caifen1985在gmail.com
星期一 十一月 6 15:28:08 HKT 2006

 class Feed(object):
> > item_pubdate = None
> > item_enclosure_url = None
> > feed_type = feedgenerator.DefaultFeed
> > title_template = None
> > description_template = None
> >
> > def __init__(self, slug, feed_url):
> > self.slug = slug
> > self.feed_url = feed_url
> > self.title_template_name = self.title_template or ('feeds/%s_title.html'
> > % slug)
> > self.description_template_name = self.description_template or
> > ('feeds/%s_description.html' % slug)

第一个title_template与__init__中的title_template是一个东西吗?我怎么觉得第一个是Feed类的,第二个是Feed对象拥有的?不知道我的理解对不对,初学.

On 11/6/06, 大熊 <bearsprite在gmail.com> wrote:
> 子类有可能把这个None改掉了
>
> 2006/11/5, leopay <leopay在gmail.com>:
> > 在django/contrib/syndication/feeds.py中:
> > 关于feed类的定义
> >
> > class Feed(object):
> > item_pubdate = None
> > item_enclosure_url = None
> > feed_type = feedgenerator.DefaultFeed
> > title_template = None
> > description_template = None
> >
> > def __init__(self, slug, feed_url):
> > self.slug = slug
> > self.feed_url = feed_url
> > self.title_template_name = self.title_template or ('feeds/%s_title.html'
> > % slug)
> > self.description_template_name = self.description_template or
> > ('feeds/%s_description.html' % slug)
> >
> >
> >
> 在__init__函数中title_template_name,description_template_name的赋值为什么要
> > 做一下判断,在前面不是已经定义title_template = None了么,
> > self.title_template_name = self.title_template or ('feeds/%s_title.html'
> > % slug)不就是
> > self.title_template_name = 'feeds/%s_title.html' % slug,
> > 为什么还要在or前面判断一下?
> > _______________________________________________
> > 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
>


-- 
蔡峰 Cai Feng

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

2006年11月06日 星期一 15:34

limodou limodou在gmail.com
星期一 十一月 6 15:34:27 HKT 2006

On 11/6/06, cai feng <caifen1985在gmail.com> wrote:
>  class Feed(object):
> > > item_pubdate = None
> > > item_enclosure_url = None
> > > feed_type = feedgenerator.DefaultFeed
> > > title_template = None
> > > description_template = None
> > >
> > > def __init__(self, slug, feed_url):
> > > self.slug = slug
> > > self.feed_url = feed_url
> > > self.title_template_name = self.title_template or ('feeds/%s_title.html'
> > > % slug)
> > > self.description_template_name = self.description_template or
> > > ('feeds/%s_description.html' % slug)
>
> 第一个title_template与__init__中的title_template是一个东西吗?我怎么觉得第一个是Feed类的,第二个是Feed对象拥有的?不知道我的理解对不对,初学.
>
这种用法体现了python的动态特性。在处理self.attribute时,如果要处理的是一个实例,那么python先在实例的属性中查找是否有attribute这个属性,如果没有,则查找对应的类属性是否有,如果还有没有,再按基类顺序来查找基类中的这个属性,如果还有没,则处理特殊的类方法,如__getattr__或__getattribute__(用在newstyleclass中),再没有就抛异常了。

所以self.attribute当实例属性不存在时会自动引用类属性。

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

cf

2006年11月06日 星期一 23:41

cai feng caifen1985在gmail.com
星期一 十一月 6 23:41:03 HKT 2006

呵呵,解释的很详细,谢谢.
我把类里面的attribute当成java中的staic属性的内容了.
把__init__中的self.attribute当成java中的一般属性了.

另外我还有一个疑问,
在javascript中也有
function a(){
this.attribute=1;
attribute=2;
}
这两个attribute使用时我也不太明白,不知道能否解释一下?

On 11/6/06, limodou <limodou在gmail.com> wrote:
> On 11/6/06, cai feng <caifen1985在gmail.com> wrote:
> >  class Feed(object):
> > > > item_pubdate = None
> > > > item_enclosure_url = None
> > > > feed_type = feedgenerator.DefaultFeed
> > > > title_template = None
> > > > description_template = None
> > > >
> > > > def __init__(self, slug, feed_url):
> > > > self.slug = slug
> > > > self.feed_url = feed_url
> > > > self.title_template_name = self.title_template or ('feeds/%s_title.html'
> > > > % slug)
> > > > self.description_template_name = self.description_template or
> > > > ('feeds/%s_description.html' % slug)
> >
> > 第一个title_template与__init__中的title_template是一个东西吗?我怎么觉得第一个是Feed类的,第二个是Feed对象拥有的?不知道我的理解对不对,初学.
> >
> 这种用法体现了python的动态特性。在处理self.attribute时,如果要处理的是一个实例,那么python先在实例的属性中查找是否有attribute这个属性,如果没有,则查找对应的类属性是否有,如果还有没有,再按基类顺序来查找基类中的这个属性,如果还有没,则处理特殊的类方法,如__getattr__或__getattribute__(用在newstyleclass中),再没有就抛异常了。
>
> 所以self.attribute当实例属性不存在时会自动引用类属性。
>
> --
> 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


-- 
蔡峰 Cai Feng

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

2006年11月07日 星期二 01:03

fdcn fdcn64在gmail.com
星期二 十一月 7 01:03:38 HKT 2006

在javascript的例子中,a应当是一个对象初创化函数,或者是一个可以赋值给其它对象的属性。
那么this.attribute=1中的this表示它创建的对象或依附对象,表达式将该对象的attribute属性赋值为1。比如
oA=new a()或者oB.fn=a;oB.fn();
执行后,oA.attribute和oB.attribute的值就成为1。

至于attribute2=2,则仅仅是对attribute进行赋值,这个attribute只是个变量,与上述的对象没有什么关系。注意到你给的例子没有var声明,该变量应当是该函数外的变量(全局变量,或包含a函数的域的局部变量)。

On 11/6/06, cai feng <caifen1985在gmail.com> wrote:
>
> 呵呵,解释的很详细,谢谢.
> 我把类里面的attribute当成java中的staic属性的内容了.
> 把__init__中的self.attribute当成java中的一般属性了.
>
> 另外我还有一个疑问,
> 在javascript中也有
> function a(){
> this.attribute=1;
> attribute=2;
> }
> 这两个attribute使用时我也不太明白,不知道能否解释一下?
>
> On 11/6/06, limodou <limodou在gmail.com> wrote:
> > On 11/6/06, cai feng <caifen1985在gmail.com> wrote:
> > >  class Feed(object):
> > > > > item_pubdate = None
> > > > > item_enclosure_url = None
> > > > > feed_type = feedgenerator.DefaultFeed
> > > > > title_template = None
> > > > > description_template = None
> > > > >
> > > > > def __init__(self, slug, feed_url):
> > > > > self.slug = slug
> > > > > self.feed_url = feed_url
> > > > > self.title_template_name = self.title_template or
> ('feeds/%s_title.html'
> > > > > % slug)
> > > > > self.description_template_name = self.description_template or
> > > > > ('feeds/%s_description.html' % slug)
> > >
> > >
> 第一个title_template与__init__中的title_template是一个东西吗?我怎么觉得第一个是Feed类的,第二个是Feed对象拥有的?不知道我的理解对不对,初学.
> > >
> > 这种用法体现了python的动态特性。在处理self.attribute时,
> 如果要处理的是一个实例,那么python先在实例的属性中查找是否有attribute这个属性,如果没有,则查找对应的类属性是否有,如果还有没有,再按基类顺序来查找基类中的这个属性,如果还有没,则处理特殊的类方法,如__getattr__或__getattribute__(用在newstyleclass中),再没有就抛异常了。
> >
> > 所以self.attribute当实例属性不存在时会自动引用类属性。
> >
> > --
> > 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
>
>
> --
> 蔡峰 Cai Feng
> _______________________________________________
> 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
-------------- 下一部分 --------------
一个HTML附件被移除...
URL: http://python.cn/pipermail/python-chinese/attachments/20061107/6dd44f87/attachment.html 

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

2006年11月07日 星期二 01:12

fdcn fdcn64在gmail.com
星期二 十一月 7 01:12:18 HKT 2006

很抱歉,文字表达有误,重发一遍。

在javascript的例子中,a应当是一个对象初创化函数,或者该函数本身可以赋值给其它对象的属性。
那么this.attribute=1中的this表示它创建的对象或依附对象,该表达式将该对象的attribute属性赋值为1。比如
oA=new a();//创建的对象
或者
oB.fn=a;//依附一个对象上
oB.fn();
上面执行后,oA.attribute和oB.attribute的值就成为1。

至于attribute2=2,则仅仅是对attribute2进行赋值,这个attribute2
只是个变量,与上述的对象没有什么关系。注意到你给的例子没有var声明,该变量应当是该函数外的变量(全局变量,或包含a函数的域的局部变量)。

如果有函数内部用var进行了声明,声明的变量就是该函数的局部对象,不要将它看成java类的域成员,在javascript中,这个变量仅仅是一个函数的局部对象而已,即使这个函数用来创建类对象。


On 11/7/06, fdcn <fdcn64在gmail.com> wrote:
>
> 在javascript的例子中,a应当是一个对象初创化函数,或者是一个可以赋值给其它对象的属性。
> 那么this.attribute=1中的this表示它创建的对象或依附对象,表达式将该对象的attribute属性赋值为1。比如
> oA=new a()或者oB.fn=a;oB.fn();
> 执行后,oA.attribute和oB.attribute的值就成为1。
>
> 至于attribute2=2,则仅仅是对attribute进行赋值,这个attribute只是个变量,与上述的对象没有什么关系。注意到你给的例子没有var声明,该变量应当是该函数外的变量(全局变量,或包含a函数的域的局部变量)。
>
>
> On 11/6/06, cai feng <caifen1985在gmail.com> wrote:
> >
> > 呵呵,解释的很详细,谢谢.
> > 我把类里面的attribute当成java中的staic属性的内容了.
> > 把__init__中的self.attribute当成java中的一般属性了.
> >
> > 另外我还有一个疑问,
> > 在javascript中也有
> > function a(){
> > this.attribute=1;
> > attribute=2;
> > }
> > 这两个attribute使用时我也不太明白,不知道能否解释一下?
> >
> > On 11/6/06, limodou <limodou在gmail.com> wrote:
> > > On 11/6/06, cai feng <caifen1985在gmail.com> wrote:
> > > >  class Feed(object):
> > > > > > item_pubdate = None
> > > > > > item_enclosure_url = None
> > > > > > feed_type = feedgenerator.DefaultFeed
> > > > > > title_template = None
> > > > > > description_template = None
> > > > > >
> > > > > > def __init__(self, slug, feed_url):
> > > > > > self.slug = slug
> > > > > > self.feed_url = feed_url
> > > > > > self.title_template_name = self.title_template or
> > ('feeds/%s_title.html'
> > > > > > % slug)
> > > > > > self.description_template_name = self.description_template or
> > > > > > ('feeds/%s_description.html' % slug)
> > > >
> > > >
> > 第一个title_template与__init__中的title_template是一个东西吗?我怎么觉得第一个是Feed类的,第二个是Feed对象拥有的?不知道我的理解对不对,初学.
> > > >
> > > 这种用法体现了python的动态特性。在处理self.attribute时,如果要处理的是一个实例,那么python先在实例的属性中查找是否有attribute这个属性,如果没有,则查找对应的类属性是否有,如果还有没有,再按基类顺序来查找基类中的这个属性,如果还有没,则处理特殊的类方法,如__getattr__或__getattribute__(用在newstyleclass中),再没有就抛异常了。
> >
> > >
> > > 所以self.attribute当实例属性不存在时会自动引用类属性。
> > >
> > > --
> > > 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
> >
> >
> > --
> > 蔡峰 Cai Feng
> > _______________________________________________
> > 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
>
>
>
-------------- 下一部分 --------------
一个HTML附件被移除...
URL: http://python.cn/pipermail/python-chinese/attachments/20061107/ccbf502d/attachment.html 

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

cf

2006年11月07日 星期二 01:18

cai feng caifen1985在gmail.com
星期二 十一月 7 01:18:21 HKT 2006

谢谢fdcn  <fdcn64在gmail.com>  的回答.
很不好意思,我代码打错了.
第二个attribute也应该是a这个类中的元素,我分不清楚,这里的两个attribute有什么区别,但是我知道在使用过程中肯定是有区别的.因为我在实际编码过程中遇到过类似的问题,以前都是直接跳过去的,并没有深究.我觉得这里应该是我对变量作用域理解不够造成的.
代码如下:
function a(){
this.attribute=1;
var attribute=2;
function innerfunc(){
    alert(attribute);
}
function innerfunc2(){
    alert(this.attribute);
}
}

test1=new a();
test1.innerfunc();
test1.innerfunc2();
test1.attribute=3;
test2=new a();
test2.innerfunc();
test2.innerfunc2();

其实主要就是a类中的那个var attribute是不是在所有a的对象中只有一份,也就是跟static类似.a中的this.attribute是挺容易理解的.


On 11/7/06, fdcn <fdcn64在gmail.com> wrote:
> 在javascript的例子中,a应当是一个对象初创化函数,或者是一个可以赋值给其它对象的属性。
> 那么this.attribute=1中的this表示它创建的对象或依附对象,表达式将该对象的attribute属性赋值为1。比如
> oA=new a()或者oB.fn=a;oB.fn();
> 执行后,oA.attribute和oB.attribute的值就成为1。
>
> 至于attribute2=2,则仅仅是对attribute进行赋值,这个attribute只是个变量,与上述的对象没有什么关系。注意到你给的例子没有var声明,该变量应当是该函数外的变量(全局变量,或包含a函数的域的局部变量)。
>
>
> On 11/6/06, cai feng <caifen1985在gmail.com> wrote:
> >
> > 呵呵,解释的很详细,谢谢.
> > 我把类里面的attribute当成java中的staic属性的内容了.
> > 把__init__中的self.attribute当成java中的一般属性了.
> >
> > 另外我还有一个疑问,
> > 在javascript中也有
> > function a(){
> > this.attribute=1;
> > attribute=2;
> > }
> > 这两个attribute使用时我也不太明白,不知道能否解释一下?
> >
> > On 11/6/06, limodou <limodou在gmail.com> wrote:
> > > On 11/6/06, cai feng <caifen1985在gmail.com> wrote:
> > > >  class Feed(object):
> > > > > > item_pubdate = None
> > > > > > item_enclosure_url = None
> > > > > > feed_type = feedgenerator.DefaultFeed
> > > > > > title_template = None
> > > > > > description_template = None
> > > > > >
> > > > > > def __init__(self, slug, feed_url):
> > > > > > self.slug = slug
> > > > > > self.feed_url = feed_url
> > > > > > self.title_template_name = self.title_template or
> ('feeds/%s_title.html'
> > > > > > % slug)
> > > > > > self.description_template_name = self.description_template or
> > > > > > ('feeds/%s_description.html' % slug)
> > > >
> > > >
> 第一个title_template与__init__中的title_template是一个东西吗?我怎么觉得第一个是Feed类的,第二个是Feed对象拥有的?不知道我的理解对不对,初学.
> > > >
> > >
> 这种用法体现了python的动态特性。在处理self.attribute时,如果要处理的是一个实例,那么python先在实例的属性中查找是否有attribute这个属性,如果没有,则查找对应的类属性是否有,如果还有没有,再按基类顺序来查找基类中的这个属性,如果还有没,则处理特殊的类方法,如__getattr__或__getattribute__(用在newstyleclass中),再没有就抛异常了。
> > >
> > > 所以self.attribute当实例属性不存在时会自动引用类属性。
> > >
> > > --
> > > 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
> >
> >
> > --
> > 蔡峰 Cai Feng
> > _______________________________________________
> > 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
>


-- 
蔡峰 Cai Feng

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

2006年11月07日 星期二 03:05

fdcn fdcn64在gmail.com
星期二 十一月 7 03:05:46 HKT 2006

其实我在上面已经说了它们的区别了,区别就在于,this.attr的attr是该对象的一个属性,var attr只是这个函数的一个局部变量。

我们简单点,看一看你的例子在功能和概念上与java是怎么对应的:
javascript:
function a(){
this.attribute=1;
var attribute=2;
}
java:
class a{
public int attribute=1;
public a(){
int attribute=2;
 }
 }

注意到了吗?虽然它们都用同样的标识符,但两个变量是完全不同的。javascript的a函数的作用就是java中a类的构造函数,所有在javascript的a函数中定义的变量只是OOP中构造函数的局
部变量。由于javascript是动态语言,它不需要明确定义类(在js中实际是对象)的域变量,只需要在函数中直接使用this.attribute即可,javascript就会动态地为该对象增加一个"域变量"(实际上是属性)。

随着函数执行完毕,这个var声明的局部变量就被垃圾回收了,对,没有了!(除非还有变量指向该局部对象,涉及闭包函数,暂不讨论)

局部变量的作用在javascript函数的大多数情况下就是一临时变量。

比如:
function a(){
var m=8;
}
x=new a();
这里,m已完全没有了,完全不可访问的,因为它只存在于new a()这一短暂的时间中,现在你想通过x.m是不可能访问到的。这个x与new
Object()产生的对象本质上是一样的,就象m从来没有出现过一样。请回想c或java的函数局部变量。

但this.attr不同,它是对象的属性,相当于c++或java的域变量,可以通过点操作符来访问的。

其实,javascript开发者常常利用局部变量这一点来实现"私有"域变量,需要运用闭包的技巧,暂不叙述。

回过头来,你的例子下方的测试是有错误的,由于内部变量和函数都是临时的(局部的),根本不可能从对象处用点操作符访问,就象不能访问java类a的构造函数里的attribute一样:
test1=new a();
test1.innerfunc();//出错:test1没有innerfunc函数
test1.innerfunc2();//出错:test1没有innerfunc2函数
test1.attribute=3;//正确,它把构造函数中this.attribute的值由1重新赋值为3
test2=new a();
test2.innerfunc();//出错:test2没有innerfunc函数
test2.innerfunc2();//出错:test2没有innerfunc2函数

On 11/7/06, cai feng <caifen1985在gmail.com> wrote:
>
> 谢谢fdcn  <fdcn64在gmail.com>  的回答.
> 很不好意思,我代码打错了.
> 第二个attribute也应该是a这个类中的元素,我分不清楚,这里的两个attribute有什么区别,
> 但是我知道在使用过程中肯定是有区别的.因为我在实际编码过程中遇到过类似的问题,以前都是直接跳过去的,
> 并没有深究.我觉得这里应该是我对变量作用域理解不够造成的.
> 代码如下:
> function a(){
> this.attribute=1;
> var attribute=2;
> function innerfunc(){
>     alert(attribute);
> }
> function innerfunc2(){
>     alert(this.attribute);
> }
> }
>
> test1=new a();
> test1.innerfunc();
> test1.innerfunc2();
> test1.attribute=3;
> test2=new a();
> test2.innerfunc();
> test2.innerfunc2();
>
> 其实主要就是a类中的那个var attribute是不是在所有a的对象中只有一份,
> 也就是跟static类似.a中的this.attribute是挺容易理解的.
>
>
> On 11/7/06, fdcn <fdcn64在gmail.com> wrote:
> > 在javascript的例子中,a应当是一个对象初创化函数,或者是一个可以赋值给其它对象的属性。
> > 那么this.attribute=1中的this表示它创建的对象或依附对象,表达式将该对象的attribute属性赋值为1。比如
> > oA=new a()或者oB.fn=a;oB.fn();
> > 执行后,oA.attribute和oB.attribute的值就成为1。
> >
> >
> 至于attribute2=2,则仅仅是对attribute进行赋值,这个attribute只是个变量,与上述的对象没有什么关系。注意到你给的例子没有var声明,该变量应当是该函数外的变量(全局变量,或包含a函数的域的局部变量)。
> >
> >
> > On 11/6/06, cai feng <caifen1985在gmail.com> wrote:
> > >
> > > 呵呵,解释的很详细,谢谢.
> > > 我把类里面的attribute当成java中的staic属性的内容了.
> > > 把__init__中的self.attribute当成java中的一般属性了.
> > >
> > > 另外我还有一个疑问,
> > > 在javascript中也有
> > > function a(){
> > > this.attribute=1;
> > > attribute=2;
> > > }
> > > 这两个attribute使用时我也不太明白,不知道能否解释一下?
> > >
> > > On 11/6/06, limodou <limodou在gmail.com> wrote:
> > > > On 11/6/06, cai feng <caifen1985在gmail.com> wrote:
> > > > >  class Feed(object):
> > > > > > > item_pubdate = None
> > > > > > > item_enclosure_url = None
> > > > > > > feed_type = feedgenerator.DefaultFeed
> > > > > > > title_template = None
> > > > > > > description_template = None
> > > > > > >
> > > > > > > def __init__(self, slug, feed_url):
> > > > > > > self.slug = slug
> > > > > > > self.feed_url = feed_url
> > > > > > > self.title_template_name = self.title_template or
> > ('feeds/%s_title.html'
> > > > > > > % slug)
> > > > > > > self.description_template_name = self.description_template or
> > > > > > > ('feeds/%s_description.html' % slug)
> > > > >
> > > > >
> >
> 第一个title_template与__init__中的title_template是一个东西吗?我怎么觉得第一个是Feed类的,第二个是Feed对象拥有的?不知道我的理解对不对,初学.
> > > > >
> > > >
> > 这种用法体现了python的动态特性。在处理self.attribute时,
> 如果要处理的是一个实例,那么python先在实例的属性中查找是否有attribute这个属性,如果没有,则查找对应的类属性是否有,如果还有没有,再按基类顺序来查找基类中的这个属性,如果还有没,则处理特殊的类方法,如__getattr__或__getattribute__(用在newstyleclass中),再没有就抛异常了。
> > > >
> > > > 所以self.attribute当实例属性不存在时会自动引用类属性。
> > > >
> > > > --
> > > > 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
> > >
> > >
> > > --
> > > 蔡峰 Cai Feng
> > > _______________________________________________
> > > 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
> >
>
>
> --
> 蔡峰 Cai Feng
> _______________________________________________
> 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
-------------- 下一部分 --------------
一个HTML附件被移除...
URL: http://python.cn/pipermail/python-chinese/attachments/20061107/856de6d3/attachment.htm 

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

2006年11月07日 星期二 03:43

fdcn fdcn64在gmail.com
星期二 十一月 7 03:43:20 HKT 2006

>
> 其实主要就是a类中的那个var attribute是不是在所有a的对象中只有一份,
> 也就是跟static类似.a中的this.attribute是挺容易理解的.


这个var attribute是随着每一次new a()时新生成,new
a()结束后又自动销毁,只剩下new出来的新对象了。你认为会只有一份吗?在我们的例子中,一份也没有,它产生新对象后就消失了。

不过,我们应当把它看成随着每一个对象都有一份拷贝。因为在有此情况下,这个局部变量并不消失,这时我们看到的就是每产生一个新对象就有一个新的var
attribute产生。

你理解的static变量,在js中并没有完全对应的东西,但可以通过每一个对象的prototype属性实现类似的只有一份的属性(主要是函数)。但抱歉,它不是static。

建议你看看《javascript权威指南》或《javaScript高级程序设计》等书,这里是python的列表,我不好篇幅长了。
-------------- 下一部分 --------------
一个HTML附件被移除...
URL: http://python.cn/pipermail/python-chinese/attachments/20061107/2143f80b/attachment.html 

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

2006年11月07日 星期二 13:18

limodou limodou在gmail.com
星期二 十一月 7 13:18:09 HKT 2006

On 11/7/06, fdcn <fdcn64在gmail.com> wrote:
>
> > 其实主要就是a类中的那个var
> attribute是不是在所有a的对象中只有一份,也就是跟static类似.a中的this.attribute是挺容易理解的.
>
>
> 这个var attribute是随着每一次new a()时新生成,new
> a()结束后又自动销毁,只剩下new出来的新对象了。你认为会只有一份吗?在我们的例子中,一份也没有,它产生新对象后就消失了。
>
> 不过,我们应当把它看成随着每一个对象都有一份拷贝。因为在有此情况下,这个局部变量并不消失,这时我们看到的就是每产生一个新对象就有一个新的var
> attribute产生。
>
> 你理解的static变量,在js中并没有完全对应的东西,但可以通过每一个对象的prototype属性实现类似的只有一份的属性(主要是函数)。但抱歉,它不是static。
>
> 建议你看看《javascript权威指南》或《javaScript高级程序设计》等书,这里是python的列表,我不好篇幅长了。
>
this.attribute是一个实例属性,因此可以被外部进行使用。而var attribute是一个局部变量,不能为外部进行使用。
记得好象有人通过局部变量来实现私有属性。

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

cf

2006年11月09日 星期四 00:42

cai feng caifen1985在gmail.com
星期四 十一月 9 00:42:23 HKT 2006

非常感谢fdcn<fdcn64在gmail.com>的回答
你的回答已经很详细了,我已经清楚这里面的区别了.
我觉得你提到的function a(){}是构造函数这一点对我理解的帮助最大了.
很抱歉,在python邮件列表中询问了这么多javascript问题.我想对于我这个讨论就到这里结束吧,其他问题我会通过相关途径自己解决掉的.
再次感谢大家关注.

On 11/7/06, fdcn <fdcn64在gmail.com> wrote:
>
> > 其实主要就是a类中的那个var
> attribute是不是在所有a的对象中只有一份,也就是跟static类似.a中的this.attribute是挺容易理解的.
>
> 这个var attribute是随着每一次new a()时新生成,new
> a()结束后又自动销毁,只剩下new出来的新对象了。你认为会只有一份吗?在我们的例子中,一份也没有,它产生新对象后就消失了。
>
> 不过,我们应当把它看成随着每一个对象都有一份拷贝。因为在有此情况下,这个局部变量并不消失,这时我们看到的就是每产生一个新对象就有一个新的var
> attribute产生。
>
> 你理解的static变量,在js中并没有完全对应的东西,但可以通过每一个对象的prototype属性实现类似的只有一份的属性(主要是函数)。但抱歉,它不是static。
>
> 建议你看看《javascript权威指南》或《javaScript高级程序设计》等书,这里是python的列表,我不好篇幅长了。
>
> _______________________________________________
> 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
>


-- 
蔡峰 Cai Feng

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

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

    你的回复:

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

    Zeuux © 2025

    京ICP备05028076号