2011-01-27 8 views
5

で重複を避ける私は最近のUbuntu Serverの管理のためのPython 2.6を使用して開始し、冗長性に関する2つのマイナーな問題があります。は、Python

最初のものを輸入している:彼らはすべてのクラス

から何か

などのインポートクラスを見て

from class import Class 

そして2つ目は__init__メソッドです10

これらの重複を避ける方法はありますか?

答えて

7

第2の点は、冗長性ではなく、インスタンス属性を設定することです。

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ではありません。通常、1つのモジュールに複数のオブジェクトを保持する必要があります。そのモジュール自体はオブジェクトであることに注意してください。また、モジュールの名前を正しく指定する必要があります。デフォルトのコードスタイルガイドでは、モジュールはすべて小文字でなくてはならないと言います。たとえば、reまたはurllibのようになります。引数のための

+0

ありがとうございました!私はインポートを修正して、今からモジュールを小文字にしておきます。大きなモジュールを分割せずに効果的に処理/編集する方法は? – Jasper

+0

大きなモジュールではどういう意味ですか? 3k行のコードは大きなモジュールですか?そのようなモジュールは多くのクラスを含むことができます。 Pythonでは 'Java' /' C++ 'よりもはるかにまばらにコード化することができるので、モジュール上に複数のクラスを保持することは意味がありません。 – gruszczy

1

バージョン:

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

これは醜いです... – aaronasterling

+0

私は同意します、これはまったくPythonicではありません。明示的なものは暗黙的なものよりも優れています。これは私に暗黙の魔法の軽度のケースのように見えます。 –

+1

*実際の属性名はarg0からargNではないので、実際の属性名はシーケンスでなければなりません。そうでない場合、この答えは当てはまりません。 –

2
from module import Class 

クラス名は、それを含むモジュールの名前と異なるであることが一般的です。同じ名前のモジュールごとにクラスが1つしかない場合は、そのクラスを階層内のレベルに移動することを検討してください。

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

これは、多くの場合、ちょっと迷惑なように見えるんが、それは選択肢に比べて、本当に悪い、読みやすさ、賢明ではありません。しかし、単にinitで他の作業を行わずに属性として割り当てるだけのパラメータがたくさんある場合は、そのような定型文を生成する名前付きタプルなどから継承することを検討してください。 (Namedtupleは特に他の問題を抱えており、時には適切な場合があります。このタイプの定型文を処理できる基底クラスの例として使用しています)