2011-01-27 83 views
5

我最近使用Python 2.6 Ubuntu服务器管理员起步,并没有关于冗余两个小问题:避免冗余在Python

第一件事是进口的:他们都看起来像

进口类从

from class import Class 

第二件事是__init__方法:

__init__(self,arg1,...,argn): 
    self.arg1 = arg1 
    ... 
    self.argn = argn 

有没有办法避免这些重复?

回答

7

第二件事不是冗余 - 它是设置实例属性。你可以这样做也是这样:

class Foo: 

    def __init__(self, **kwargs): 
     for name, value in kwargs.items(): 
      setattr(self, name, value) 

但随后你需要调用美孚这样的:

Foo(arg1=1, arg2=2, arg3=3) 

而且你的进口似乎有语法不正确的。它应该是from Class import Class。这看起来对你来说是多余的,因为看起来,你将每个类存储在一个单独的文件(模块)中 - 而这完全是多余的。 Python不是Java,你通常应该在一个模块中容纳更多的对象。请记住,该模块本身就是一个对象。你也应该正确地命名模块 - 默认的代码风格指南指出模块应该全部小写,没有特殊的字符。例如,像reurllib

+0

已经感谢!我纠正了我的导入,并将从现在开始保持模块小写。如何在不分割它们的情况下有效地处理/编辑大型模块? – Jasper 2011-01-27 10:01:13

+0

大型模块是什么意思? 3k行代码是一个大型模块吗?这样的模块可以包含很多类。您可以在python中编写比`Java` /`C++`更稀疏的代码,因此在模块中保留多个类并不意味着这很大。 – gruszczy 2011-01-27 10:16:37

1

版本ARGS:

class Foo: 

    def __init__(self, *args): 
     for index,arg in enumerate(args): 
      setattr(self, 'arg%s'%index, arg) 


Foo(1,2,3) 
>>> Foo.arg0 
1 
2
from module import Class 

是很常见的类名是从他们包含模块的名称不同。如果每个模块只有一个具有相同名称的类,请考虑将该类在层次结构中上移一级。

def __init__(self, a, b, c): 
    self.a = a 
    self.b = b 
    self.c = c 

但这往往似乎是有点儿讨厌,但它确实不坏,可读性的角度来看,相较于替代品。然而,如果你有很多参数只是你的init中没有其他工作的属性,那么就考虑继承一个namedtuple或者类似的东西,它可以为你生成这样的样板文件。 (特别是Namedtuple有其他分支,只会有时适用,我将它用作可以处理这种类型样板的基类的一个例子。)