で重複を避ける私は最近のUbuntu Serverの管理のためのPython 2.6を使用して開始し、冗長性に関する2つのマイナーな問題があります。は、Python
最初のものを輸入している:彼らはすべてのクラス
から何かなどのインポートクラスを見て :
from class import Class
そして2つ目は__init__
メソッドです10
これらの重複を避ける方法はありますか?
で重複を避ける私は最近のUbuntu Serverの管理のためのPython 2.6を使用して開始し、冗長性に関する2つのマイナーな問題があります。は、Python
最初のものを輸入している:彼らはすべてのクラス
から何かなどのインポートクラスを見て :
from class import Class
そして2つ目は__init__
メソッドです10
これらの重複を避ける方法はありますか?
第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
のようになります。引数のための
バージョン:
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
これは醜いです... – aaronasterling
私は同意します、これはまったくPythonicではありません。明示的なものは暗黙的なものよりも優れています。これは私に暗黙の魔法の軽度のケースのように見えます。 –
*実際の属性名はarg0からargNではないので、実際の属性名はシーケンスでなければなりません。そうでない場合、この答えは当てはまりません。 –
from module import Class
クラス名は、それを含むモジュールの名前と異なるであることが一般的です。同じ名前のモジュールごとにクラスが1つしかない場合は、そのクラスを階層内のレベルに移動することを検討してください。
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
これは、多くの場合、ちょっと迷惑なように見えるんが、それは選択肢に比べて、本当に悪い、読みやすさ、賢明ではありません。しかし、単にinitで他の作業を行わずに属性として割り当てるだけのパラメータがたくさんある場合は、そのような定型文を生成する名前付きタプルなどから継承することを検討してください。 (Namedtupleは特に他の問題を抱えており、時には適切な場合があります。このタイプの定型文を処理できる基底クラスの例として使用しています)
ありがとうございました!私はインポートを修正して、今からモジュールを小文字にしておきます。大きなモジュールを分割せずに効果的に処理/編集する方法は? – Jasper
大きなモジュールではどういう意味ですか? 3k行のコードは大きなモジュールですか?そのようなモジュールは多くのクラスを含むことができます。 Pythonでは 'Java' /' C++ 'よりもはるかにまばらにコード化することができるので、モジュール上に複数のクラスを保持することは意味がありません。 – gruszczy