避免Python中的冗余

时间:2011-01-27 09:33:30

标签: python import init redundancy

我最近开始使用Python 2.6 for Ubuntu Server admin,并且有两个与冗余有关的小问题:

首先是进口:它们看起来像

从类

导入类
from class import Class

第二件事是__init__方法:

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

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

3 个答案:

答案 0 :(得分:7)

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

class Foo:

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

但是你需要像这样打电话给Foo:

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

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

答案 1 :(得分:2)

from module import Class

类名与其包含模块的名称不同是很常见的。如果每个模块只有一个具有相同名称的类,请考虑将该类升级到层次结构中的某个级别。

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

这通常看起来有点令人讨厌,但与其他选择相比,它的可读性非常糟糕。但是,如果您有许多参数只是作为属性分配,而init中没有其他工作,那么请考虑从namedtuple或类似的继承,这可以为您生成这样的样板。 (Namedtuple特别有其他分支,有时只适用。我用它作为基类的一个例子,它可以处理这种类型的样板。)

答案 2 :(得分: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