我最近开始使用Python 2.6 for Ubuntu Server admin,并且有两个与冗余有关的小问题:
首先是进口:它们看起来像
从类
from class import Class
第二件事是__init__
方法:
__init__(self,arg1,...,argn):
self.arg1 = arg1
...
self.argn = argn
有没有办法避免这些重复?
答案 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,通常应该在一个模块中容纳更多对象。请记住,该模块本身就是一个对象。此外,您应该正确命名模块 - 默认的代码样式指南说模块应该全部小写,没有特殊的字符。例如,例如re
或urllib
。
答案 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