我最近使用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