避免Python中的冗余

避免Python中的冗余,python,import,init,redundancy,Python,Import,Init,Redundancy,我最近开始在Ubuntu Server admin中使用Python 2.6,在冗余方面有两个小问题: 首先是进口产品:它们看起来都像 从类导入类 第二件事是\uuuuu init\uuuu方法: __init__(self,arg1,...,argn): self.arg1 = arg1 ... self.argn = argn 有没有办法避免这些重复?第二件事不是冗余,而是设置实例属性。您也可以这样做: class Foo: def __init__(sel

我最近开始在Ubuntu Server admin中使用Python 2.6,在冗余方面有两个小问题:

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

从类导入类

第二件事是
\uuuuu init\uuuu
方法:

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

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

第二件事不是冗余,而是设置实例属性。您也可以这样做:

class Foo:

   def __init__(self, **kwargs):
       for name, value in kwargs.items():
          setattr(self, name, value)
   Foo(arg1=1, arg2=2, arg3=3)
但是你需要这样称呼Foo:

class Foo:

   def __init__(self, **kwargs):
       for name, value in kwargs.items():
          setattr(self, name, value)
   Foo(arg1=1, arg2=2, arg3=3)
此外,您的导入似乎有不正确的语法。它应该是来自类导入类的
。这对您来说似乎是多余的,因为您似乎将每个类存储在一个单独的文件(模块)中,而这恰恰是多余的。Python不是Java,您通常应该在一个模块中容纳多个对象。请记住,模块本身就是一个对象。此外,您还应该正确命名模块——默认代码样式指南规定,模块应全部为小写,不带特殊字符。例如
re
urllib

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
类名与其包含模块的名称不同是很常见的。如果每个模块只有一个名称相同的类,请考虑将该类移动到层次结构中的级别。

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

这看起来确实有点烦人,但与其他选择相比,它的可读性确实不错。但是,如果您有很多参数,您只需将其赋值为属性,而在init中没有其他工作,则考虑从NealDube或类似的继承,这样可以为您生成这样的样板。(特别是Namedtuple还有其他的分支,只是有时候才合适。我把它作为一个基类的例子,它可以处理这种类型的样板文件。)

谢谢!我更正了我的导入,从现在起将保持模块小写。在不划分大模块的情况下,如何有效地处理/编辑大模块?你所说的大模块是什么意思?3k代码行是一个大模块吗?这样的模块可以包含很多类。您可以用python编写的代码比用
Java
/
C++
编写的代码少得多,所以在模块中保留多个类并不意味着太大。我同意,这根本不是python。显式比隐式好,在我看来,这是一个温和的隐式魔术。希望实际的属性名不是arg0到argN,因为如果是,它们应该是一个序列。如果他们不是,这个答案不适用。这可能是丑陋和不和谐的,但这也不是一场重构竞赛,不是吗?代码回答了作者的问题literally@Frost:仅当您将OP对“arg1”的使用理解为实际变量名而不是元语法变量时。如果改为“foo”和“bar”,则问题保持不变,但您的答案是错误的。而且,实际上,根据您的解释,您的答案无论如何都是错误的:OP以arg1开头,但您以arg0开头。