我最近开始为 Ubuntu Server 管理员使用 Python 2.6,并且有两个关于冗余的小问题:
首先是进口:它们看起来都像
从类导入类
from class import Class
第二件事是__init__
方法:
__init__(self,arg1,...,argn):
self.arg1 = arg1
...
self.argn = argn
有没有办法避免这些重复?
我最近开始为 Ubuntu Server 管理员使用 Python 2.6,并且有两个关于冗余的小问题:
首先是进口:它们看起来都像
从类导入类
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 :
Foo(arg1=1, arg2=2, arg3=3)
此外,您的导入似乎有不正确的语法。应该是from Class import Class
。这对您来说似乎是多余的,因为您似乎将每个类存储在一个单独的文件(模块)中 - 这完全是多余的。Python 不是 Java,通常应该在一个模块中保存更多对象。请记住,该模块本身就是一个对象。此外,您应该正确命名模块 - 默认代码样式指南说模块应该全部小写,没有特殊字符。喜欢re
或urllib
例如。
from module import Class
类名与其包含模块的名称不同是很常见的。如果每个模块只有一个具有相同名称的类,请考虑将该类在层次结构中上移一级。
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
这通常看起来有点烦人,但与替代方案相比,它确实不错,可读性。但是,如果您有很多参数只是分配为属性而在您的 init 中没有其他工作,那么请考虑从 namedtuple 或类似的继承,它可以为您生成这样的样板。(特别是 Namedtuple 具有其他分支,并且仅在某些情况下才适用。我将它用作可以处理此类样板的基类的示例。)
参数版本:
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