我最近使用Python 2.6 Ubuntu服务器管理员起步,并没有关于冗余两个小问题:避免冗余在Python
第一件事是进口的:他们都看起来像
进口类从
from class import Class
第二件事是__init__
方法:
__init__(self,arg1,...,argn):
self.arg1 = arg1
...
self.argn = argn
有没有办法避免这些重复?
我最近使用Python 2.6 Ubuntu服务器管理员起步,并没有关于冗余两个小问题:避免冗余在Python
第一件事是进口的:他们都看起来像
进口类从
from class import Class
第二件事是__init__
方法:
__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)
而且你的进口似乎有语法不正确的。它应该是from Class import Class
。这看起来对你来说是多余的,因为看起来,你将每个类存储在一个单独的文件(模块)中 - 而这完全是多余的。 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
from module import Class
是很常见的类名是从他们包含模块的名称不同。如果每个模块只有一个具有相同名称的类,请考虑将该类在层次结构中上移一级。
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
但这往往似乎是有点儿讨厌,但它确实不坏,可读性的角度来看,相较于替代品。然而,如果你有很多参数只是你的init中没有其他工作的属性,那么就考虑继承一个namedtuple或者类似的东西,它可以为你生成这样的样板文件。 (特别是Namedtuple有其他分支,只会有时适用,我将它用作可以处理这种类型样板的基类的一个例子。)
已经感谢!我纠正了我的导入,并将从现在开始保持模块小写。如何在不分割它们的情况下有效地处理/编辑大型模块? – Jasper 2011-01-27 10:01:13
大型模块是什么意思? 3k行代码是一个大型模块吗?这样的模块可以包含很多类。您可以在python中编写比`Java` /`C++`更稀疏的代码,因此在模块中保留多个类并不意味着这很大。 – gruszczy 2011-01-27 10:16:37