避免Python中的冗余

6 投票
3 回答
2133 浏览
提问于 2025-04-16 10:42

我最近开始在Ubuntu服务器上使用Python 2.6来管理,遇到了两个小问题,主要是关于冗余的:

第一个问题是关于导入模块的:它们看起来都像这样

从类中导入类

from class import Class

第二个问题是__init__方法:

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

有没有办法避免这些重复的内容呢?

3 个回答

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
2
from module import Class

类的名字和它所在模块的名字不一样是很常见的。如果你每个模块里只有一个类,而且名字是一样的,考虑把这个类提升到更高的层级。

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

这确实有点烦,但从可读性上来说,比起其他选择其实还好。不过,如果你有很多参数只是简单地作为属性赋值,而在初始化时没有其他操作,那就考虑继承自namedtuple或者类似的东西,这样可以帮你自动生成这些重复的代码。(namedtuple特别有其他影响,并不是总是合适的。我只是用它作为一个可以处理这种重复代码的基类的例子。)

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 这样的名字。

撰写回答