避免Python中的冗余
我最近开始在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 不一样,通常一个模块里应该放更多的对象。记住,模块本身也是一个对象。而且你应该给模块起个合适的名字——默认的代码风格指南说模块名应该全小写,且不包含特殊字符。比如 re
或 urllib
这样的名字。