2011-01-27 110 views
5

我最近使用Python 2.6 Ubuntu服務器管理員起步,並沒有關於冗餘兩個小問題:避免冗餘在Python

第一件事是進口的:他們都看起來像

進口類從

from class import Class 

第二件事是__init__方法:

__init__(self,arg1,...,argn): 
    self.arg1 = arg1 
    ... 
    self.argn = argn 

有沒有辦法避免這些重複?

回答

7

第二件事不是冗餘 - 它是設置實例屬性。你可以這樣做也是這樣:

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,你通常應該在一個模塊中容納更多的對象。請記住,該模塊本身就是一個對象。你也應該正確地命名模塊 - 默認的代碼風格指南指出模塊應該全部小寫,沒有特殊的字符。例如,像reurllib

+0

已經感謝!我糾正了我的導入,並將從現在開始保持模塊小寫。如何在不分割它們的情況下有效地處理/編輯大型模塊? – Jasper 2011-01-27 10:01:13

+0

大型模塊是什麼意思? 3k行代碼是一個大型模塊嗎?這樣的模塊可以包含很多類。您可以在python中編寫比`Java` /`C++`更稀疏的代碼,因此在模塊中保留多個類並不意味着這很大。 – gruszczy 2011-01-27 10:16:37

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 
2
from module import Class 

是很常見的類名是從他們包含模塊的名稱不同。如果每個模塊只有一個具有相同名稱的類,請考慮將該類在層次結構中上移一級。

def __init__(self, a, b, c): 
    self.a = a 
    self.b = b 
    self.c = c 

但這往往似乎是有點兒討厭,但它確實不壞,可讀性的角度來看,相較於替代品。然而,如果你有很多參數只是你的init中沒有其他工作的屬性,那麼就考慮繼承一個namedtuple或者類似的東西,它可以爲你生成這樣的樣板文件。 (特別是Namedtuple有其他分支,只會有時適用,我將它用作可以處理這種類型樣板的基類的一個例子。)