免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3772 | 回复: 9
打印 上一主题 下一主题

把变量作为类的变量好还是作为参数传递给类函数好? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-23 03:39 |只看该作者 |倒序浏览
给我的感觉,好像这样:
  1. class xx:
  2.            def __int__(self):
  3.                       self.var = []
  4.                       self.run(self.var)
  5.            sef run(self, var):
  6.                       do_sth_with_var
复制代码


要比这样
  1. class xx:
  2.            def __int__(self):
  3.                       self.var = []
  4.            sef run(self):
  5.                       do_sth_with_self.var
复制代码

快。

是不是第一种方法省去了在类空间里寻找变量所以会快些?不知大家有什么看法。

论坛徽章:
0
2 [报告]
发表于 2008-09-23 09:04 |只看该作者
不要感觉,要有测试结果。

第一个只不过在初始化时候调用run方法而已,能看出哪儿能快的起来?

论坛徽章:
0
3 [报告]
发表于 2008-09-23 13:26 |只看该作者
两者功能不同吧……第一个是建类就执行run(),第二个是随时调用……

论坛徽章:
0
4 [报告]
发表于 2008-09-23 13:46 |只看该作者
不懂

论坛徽章:
0
5 [报告]
发表于 2008-09-23 16:39 |只看该作者
功能上的不同可以在外部调用时弥补,我的主要问题是把变量作为参数直接传递给类函数快还是在类函数里调用类变量快?

论坛徽章:
0
6 [报告]
发表于 2008-09-23 18:21 |只看该作者
那肯定是
class xx:
           def __int__(self):
                      self.var = []
           sef run(self):
                      do_sth_with_self.var
这个快,因为根本不执行run().

论坛徽章:
0
7 [报告]
发表于 2008-09-23 20:30 |只看该作者
原帖由 jjj137 于 2008-9-23 18:21 发表
那肯定是
class xx:
           def __int__(self):
                      self.var = []
           sef run(self):
                      do_sth_with_self.var
这个快,因为根本不执行run().

唉……看来我还是不写代码为好……从外部调用时这样不就好了?:
if "__name__"=="__main__":
     te = xx()
     te.run()

论坛徽章:
0
8 [报告]
发表于 2008-09-23 22:35 |只看该作者
首先回答一下LZ的一个概念(个人理解)  LZ的写法是实例变量,不是类变量。   
类变量是这样的,而且是静态的
class Student   
     name="abc"   
实例的成员变量  
class Student   
    def __init__(self)        
         self.name = "abc"   
第二:这两种写法的快慢问题。肤浅的理解一下,应该都一样吧。而且我不知道Python的编译器是否会有优化处理,如果编译器有优化,这种代码应该是没有速度区别的。   
第三,到底是用参数,还是成员变量。我觉得应该从面向对象的理解来说。  
class Student:   
      def __init__(self):        
            self.name = "pumaboyd"   
       def run(self):         
             print "who run:",
             self.name  
if __name__== '__main__':      
      aobj = Student()      
      aobj.run()   
如果是这样,应该是成员变量的方式更合理。因为你实例化中应该已经明确的对象的名称。这个run的动作,就不需要在强调一遍ruan(username)这种方式了。当然在实际运用中,不能创建对象的时候就写死username,所以我觉得这个时候构造函数以参数的方式传入就很合理了。改进如下:   
class Student:   
     def __init__(self,name):        
           self.name = name   
     def run(self):         
           print "who run:",self.name  
if __name__== '__main__':     
     aobj = Student("pumaboyd")      
     aobj.run()   
这里备注一下,Python中有定义属性的方式。但我目前的感觉是使用成员变量来作为属性更方便。个人的一点体会,还请大家指点。

[ 本帖最后由 pumaboyd 于 2008-9-24 14:13 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2008-09-24 15:52 |只看该作者
嗯,多谢楼上了~~尤其是对我的两个变量的更正~~

个人感觉上写成实例变量好像比较符合面向对象的特征。不过在有些追求效率的情况下应该怎么写呢?

论坛徽章:
0
10 [报告]
发表于 2008-09-25 22:54 |只看该作者
根据这个: http://wiki.python.org/moin/Pyth ... e28281b9112afc36aa1

好像局部变量会快一些~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP