6

我最近开始为 Ubuntu Server 管理员使用 Python 2.6,并且有两个关于冗余的小问题:

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

从类导入类

from class import Class

第二件事是__init__方法:

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

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

4

3 回答 3

8

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

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例如。

于 2011-01-27T09:37:17.137 回答
2
from module import Class

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

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

这通常看起来有点烦人,但与替代方案相比,它确实不错,可读性。但是,如果您有很多参数只是分配为属性而在您的 init 中没有其他工作,那么请考虑从 namedtuple 或类似的继承,它可以为您生成这样的样板。(特别是 Namedtuple 具有其他分支,并且仅在某些情况下才适用。我将它用作可以处理此类样板的基类的示例。)

于 2011-01-27T10:08:44.683 回答
1

参数版本:

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
于 2011-01-27T09:41:58.340 回答