Python论坛  - 讨论区

标题:[python-chinese] 如何动态地给类变量赋值

2007年01月22日 星期一 23:03

brightman fenyon在126.com
星期一 一月 22 23:03:36 HKT 2007

一个HTML附件被移除...
URL: http://python.cn/pipermail/python-chinese/attachments/20070122/dbe4588a/attachment.html 

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

2007年01月22日 星期一 23:11

limodou limodou在gmail.com
星期一 一月 22 23:11:02 HKT 2007

On 1/22/07, brightman <fenyon在126.com> wrote:
>
>  >>> class base:
>  ...     i1=0
>  ...     i2=0
>  ...
>  >>> b = base()
>  >>> for i in rang(1,3):
>  ...     b."i%d" % i = i
>
>  当然我这个写法是错的,我只想用一个快捷的方法让b.i1=1 b.i2=2 。
>  因为可能类变量i1,i2,i3....很多,我想用一个格式化的字符串(或者其他非硬编码)来引用 类实例变量
>
b.xxx 后面的xxx不能是一个表达式,如果xxx是动态算出来的,可以使用setattr(b, expression, value)来处理

-- 
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年01月23日 星期二 12:09

光清 ssb-35在sohu.com
星期二 一月 23 12:09:57 HKT 2007

我是个新手,不过我觉得你这些变量用个字典或list不一下就可以实现你的这种操作了吗?
class base:
    m = {}
b = base()
for I in rang(1,3):
    id = "i%d"%(i)
    b.m[id] = i

________________________________________
发件人: python-chinese-bounces在lists.python.cn [mailto:python-chinese-bounces在lists.python.cn] 代表 brightman
发送时间: 2007年1月22日 23:04
收件人: python-chinese在lists.python.cn
主题: [python-chinese] 如何动态地给类变量赋值

>>> class base:
...     i1=0
...     i2=0
...     
>>> b = base()
>>> for i in rang(1,3):
...     b."i%d" % i = i

当然我这个写法是错的,我只想用一个快捷的方法让b.i1=1 b.i2=2 。
因为可能类变量i1,i2,i3....很多,我想用一个格式化的字符串(或者其他非硬编码)来引用 类实例变量

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

2007年01月23日 星期二 13:12

Mingzhe Huang archerzz在gmail.com
星期二 一月 23 13:12:12 HKT 2007

setattr的参数应该是"setattr(object, name, value)"吧

楼主的代码可以这样写:
b = base()
for i in rang(1, 3):
    setattr(b, "i"+i, i)
................

On 1/22/07, limodou <limodou在gmail.com> wrote:
>
> On 1/22/07, brightman <fenyon在126.com> wrote:
> >
> >  >>> class base:
> >  ...     i1=0
> >  ...     i2=0
> >  ...
> >  >>> b = base()
> >  >>> for i in rang(1,3):
> >  ...     b."i%d" % i = i
> >
> >  当然我这个写法是错的,我只想用一个快捷的方法让b.i1=1 b.i2=2 。
> >  因为可能类变量i1,i2,i3....很多,我想用一个格式化的字符串(或者其他非硬编码)来引用 类实例变量
> >
> b.xxx 后面的xxx不能是一个表达式,如果xxx是动态算出来的,可以使用setattr(b, expression, value)来处理
>
> --
> 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




-- 
Best Regards,

Archer

Ming Zhe Huang
-------------- 下一部分 --------------
一个HTML附件被移除...
URL: http://python.cn/pipermail/python-chinese/attachments/20070123/904e9a6d/attachment.html 

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

2007年01月23日 星期二 13:20

limodou limodou在gmail.com
星期二 一月 23 13:20:42 HKT 2007

On 1/23/07, Mingzhe Huang <archerzz在gmail.com> wrote:
> setattr的参数应该是"setattr(object, name, value)"吧
>
> 楼主的代码可以这样写:
> b = base()
> for i in rang(1, 3):
>     setattr(b, "i"+i, i)
> ................
>

> > b.xxx 后面的xxx不能是一个表达式,如果xxx是动态算出来的,可以使用setattr(b,
> expression, value)来处理

我写的只是一个示例。只是想突出 name 可以是一个表达式而已。不要被文字所迷惑啊,主要是理解意思。

-- 
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年01月23日 星期二 18:31

Brightman fenyon在126.com
星期二 一月 23 18:31:07 HKT 2007

·Ç³£Ð»Ð»limodou.
ÿ´ÎÓÐÎÊÌ⣬¶¼µÃµ½ÄãÈÈÐĵĽâ´ð¡£

ÎҸоõµ½¶ÔpythonµÄ»ù±¾ÖªÊ¶»¹ºÜØÑ·¦£¬ËùÒÔ½ñÌì°Ñpython referenc·­ÁËһϡ£

ÆäÖÐÓÐЩÎÊÌâÏëÇë½Ìһϴó¼Ò
ÎÒÓõÄÊÇpythonwin2.4
1.__new__×÷ΪÀàµÄ¾²Ì¬·½·¨£¬Ëü»áµ÷ÓÃ__init__()£¬²¢·µ»ØʵÀý
>>> class C(object):
...  def __new__(self):print "call C __new__"
...  def __init__(self):print "call C __init__"
...  
>>> x=C()
call C __new__  ûÓе÷ÓÃ__init__
>>> x
>>> print x
None
>>> isinstance(x,C)
False
>>> 

2.__get__(self,instance,owner) 
ÀàµÄdict°üº¬·½·¨Ê±£¬²Å¿ÉÒÔÓ¦ÓÃÕâЩ·½·¨
>>> class A:
...  def __new__(cls):
...   print "call class A __new__"
...  def __init__(self):
...   print "call class A __init__"
...  def __del__(self):
...   print "call class A __del__"
...  def __lt__(self,other):
...   return self.num < other.num
...  def __nonzero__(self):
...   return False
...  def func1():print "func1"
... 
>>> a=A()
>>> a.__dict__
{}                                ÕâÊÇÎÒÀí½âµÄÀàdictô£¿
>>> def fun(self):
...  print "fun",self
...  
>>> a.fun = fun.__get__(a,A)
>>> a.fun()
fun <__main__.A instance at 0x00F325F8>
ÎÒ¾õµÃºÜĪÃû£¬__get__ÕæÕýÓÐʲô×÷Óã¿





Brightman
2007-01-23



·¢¼þÈË£º limodou
·¢ËÍʱ¼ä£º 2007-01-23 13:21:24
ÊÕ¼þÈË£º python-chinese在lists.python.cn
³­ËÍ£º 
Ö÷Ì⣺ Re: [python-chinese]ÈçºÎ¶¯Ì¬µØ¸øÀà±äÁ¿¸³Öµ

On 1/23/07, Mingzhe Huang  <archerzz在gmail.com > wrote:
> setattrµÄ²ÎÊýÓ¦¸ÃÊÇ"setattr(object, name, value)"°É
>
> Â¥Ö÷µÄ´úÂë¿ÉÒÔÕâÑùд£º
> b = base()
> for i in rang(1, 3):
>     setattr(b, "i"+i, i)
> ................
>

>  > b.xxx ºóÃæµÄxxx²»ÄÜÊÇÒ»¸ö±í´ïʽ£¬Èç¹ûxxxÊǶ¯Ì¬Ëã³öÀ´µÄ£¬¿ÉÒÔʹÓÃsetattr(b,
> expression, value)À´´¦Àí

ÎÒдµÄÖ»ÊÇÒ»¸öʾÀý¡£Ö»ÊÇÏëÍ»³ö name ¿ÉÒÔÊÇÒ»¸ö±í´ïʽ¶øÒÑ¡£²»Òª±»ÎÄ×ÖËùÃÔ»ó°¡£¬Ö÷ÒªÊÇÀí½âÒâ˼¡£

-- 
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
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070123/5baa6aa7/attachment.html 

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

2007年01月23日 星期二 19:12

limodou limodou在gmail.com
星期二 一月 23 19:12:49 HKT 2007

On 1/23/07, Brightman <fenyon在126.com> wrote:
>
>
> 非常谢谢limodou.
> 每次有问题,都得到你热心的解答。

不用客气。

你问的都是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年01月23日 星期二 19:35

yi huang yi.codeplayer在gmail.com
星期二 一月 23 19:35:13 HKT 2007

>
> 1.__new__作为类的静态方法,它会调用__init__(),并返回实例
> >>> class C(object):
> ...  def __new__(self):print "call C __new__"
> ...  def __init__(self):print "call C __init__"
> ...
> >>> x=C()
> call C __new__  没有调用__init__
> >>> x
> >>> print x
> None
> >>> isinstance(x,C)
> False
> >>>
>

x = C()
近似等价于:
x = C.__new__(C)
x.__init__()
但是你这里 C.__new__ 返回的是 None

2.__get__(self,instance,owner)
> 类的dict包含方法时,才可以应用这些方法
> >>> class A:
> ...  def __new__(cls):
> ...   print "call class A __new__"
> ...  def __init__(self):
> ...   print "call class A __init__"
> ...  def __del__(self):
> ...   print "call class A __del__"
> ...  def __lt__(self,other):
> ...   return self.num < other.num
> ...  def __nonzero__(self):
> ...   return False
> ...  def func1():print "func1"
> ...
> >>> a=A()
> >>> a.__dict__
> {}                                这是我理解的类dict么?
> >>> def fun(self):
> ...  print "fun",self
> ...
> >>> a.fun = fun.__get__(a,A)
> >>> a.fun()
> fun <__main__.A instance at 0x00F325F8>
> 我觉得很莫名,__get__真正有什么作用?
>

类是 A ,而非 a 。
还是推荐我自己的blog:
http://codeplayer.blogspot.com/2006/12/python-method-function-descriptor.html
里面还有一些链接,你可以仔细看看。

swordsp 兄整理了纯粹python语言方面一些东西:
http://wiki.woodpecker.org.cn/moin/PythonLanguage

-- 
http://codeplayer.blogspot.com/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://python.cn/pipermail/python-chinese/attachments/20070123/8e66d30a/attachment.html 

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

2007年01月23日 星期二 21:28

Mingzhe Huang archerzz在gmail.com
星期二 一月 23 21:28:58 HKT 2007

好blog!已经收藏了。实在忍受不了msn了,我也把blog搬到blogger上了。


On 1/23/07, yi huang <yi.codeplayer在gmail.com> wrote:
>
> 1.__new__作为类的静态方法,它会调用__init__(),并返回实例
> > >>> class C(object):
> > ...  def __new__(self):print "call C __new__"
> > ...  def __init__(self):print "call C __init__"
> > ...
> > >>> x=C()
> > call C __new__  没有调用__init__
> > >>> x
> > >>> print x
> > None
> > >>> isinstance(x,C)
> > False
> > >>>
> >
>
> x = C()
> 近似等价于:
> x = C.__new__(C)
> x.__init__()
> 但是你这里 C.__new__ 返回的是 None
>
> 2.__get__(self,instance,owner)
> > 类的dict包含方法时,才可以应用这些方法
> > >>> class A:
> > ...  def __new__(cls):
> > ...   print "call class A __new__"
> > ...  def __init__(self):
> > ...   print "call class A __init__"
> > ...  def __del__(self):
> > ...   print "call class A __del__"
> > ...  def __lt__(self,other):
> > ...   return self.num < other.num
> > ...  def __nonzero__(self):
> > ...   return False
> > ...  def func1():print "func1"
> > ...
> > >>> a=A()
> > >>> a.__dict__
> > {}                                这是我理解的类dict么?
> > >>> def fun(self):
> > ...  print "fun",self
> > ...
> > >>> a.fun = fun.__get__(a,A)
> > >>> a.fun()
> > fun <__main__.A instance at 0x00F325F8>
> > 我觉得很莫名,__get__真正有什么作用?
> >
>
> 类是 A ,而非 a 。
> 还是推荐我自己的blog:
> http://codeplayer.blogspot.com/2006/12/python-method-function-descriptor.html
> 里面还有一些链接,你可以仔细看看。
>
> swordsp 兄整理了纯粹python语言方面一些东西:
> http://wiki.woodpecker.org.cn/moin/PythonLanguage
>
> --
> 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
>



-- 
Best Regards,

Archer

Ming Zhe Huang
-------------- 下一部分 --------------
一个HTML附件被移除...
URL: http://python.cn/pipermail/python-chinese/attachments/20070123/44985891/attachment.htm 

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

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

    你的回复:

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

    Zeuux © 2025

    京ICP备05028076号