2010-12-03 12 views
1

私はいくつかの重いコマンドラインのことをしています(実際にはWebベースではありません)。そして、Pythonには新しいので、私のファイル/フォルダ/ etcを設定する方法が不思議でした。私はすべてのDB接続のものを保持することができる "ヘッダー"ファイルはありますか?Pythonプロジェクトの設定方法は?

どのようにクラスやオブジェクトを定義しますか?

+0

ただし、 classを 'class'キーワードで定義します。オブジェクトを定義するには、その型のコンストラクタへの引数を持ちたいと思う型を呼び出します。あなたはいつでもあなたのクラスを定義することができます。 – aaronasterling

+0

私はあなたがこれを読んで恩恵を受けると思いますhttp://diveintopython.org/toc/index.html – cababunga

+1

重複:これで始める:http://stackoverflow.com/search?q=%5Bpython%5D+project+organization 。 –

答えて

8

典型的なPythonモジュールのソースの例を挙げておきますが、ここにいくつかの説明があります。これは "Dims.py"という名前のファイルです。これはファイル全体ではなく、何が起こっているのかを知るための部分です。

#!/usr/bin/env python 

これは、このファイルの実行方法をシェルに伝える標準的な最初の行です。 /usr/bin/pythonの代わりに/usr/bin/env pythonと言うと、シェルはユーザのPATH経由でPythonを見つけるように指示します。目的のPythonは~/binまたは/usr/local/binにある可能性があります。

"""Library for dealing with lengths and locations.""" 

ファイル内の最初のものが文字列の場合は、モジュールのドキュメント文字列です。 docstringは、アイテムの開始直後に表示される文字列で、__doc__プロパティでアクセスできます。この場合、モジュールのdocstringなので、ユーザがimport Dimsでこのファイルをインポートすると、Dims.__doc__がこの文字列を返します。

# Units 
MM_BASIC = 1500000 
MILS_BASIC = 38100 
IN_BASIC = MILS_BASIC * 1000 

PEP (Python Enhancement Proposal) 8として知られている文書の書式設定や命名規則のための良好なガイドラインがたくさんあります。これらはモジュールレベルの変数(定数、実際は)なので、すべて大文字の下線で書かれています。いいえ、私はすべてのルールに従っていません。古い習慣は激しく死ぬ。あなたは新鮮になっているので、できない限りPEP 8に従ってください。

_SCALING = 1 
_SCALES = { 
    mm_basic: MM_BASIC, 
    "mm": MM_BASIC, 
    mils_basic: MILS_BASIC, 
    "mil": MILS_BASIC, 
    "mils": MILS_BASIC, 
    "basic": 1, 
    1: 1 
} 

これらのモジュールレベルの変数には、名前に下線が付きます。これにより、彼らはimport DimsにあなたにDims._SCALINGをアクセスさせないという点で、彼らに限定された「プライバシー」を与えます。しかし、あなたがそれを混乱させる必要があるならば、あなたは明白にimport Dims._SCALING as scalingのように言うことができます。

def UnitsToScale(units=None): 
    """Scales the given units to the current scaling.""" 
    if units is None: 
     return _SCALING 
    elif units not in _SCALES: 
     raise ValueError("unrecognized units: '%s'." % units) 
    return _SCALES[units] 

UnitsToScaleはモジュールレベルの機能です。 docstringとデフォルト値と例外の使用に注意してください。デフォルト値宣言では、=の周囲に空白は入れないでください。

class Length(object): 
    """A length. Makes unit conversions easier. 

    The basic, mm, and mils properties can be used to get or set the length 
    in the desired units. 
    >>> x = Length(mils=1000) 
    >>> x.mils 
    1000.0 
    >>> x.mm 
    25.399999999999999 
    >>> x.basic 
    38100000L 
    >>> x.mils = 100 
    >>> x.mm 
    2.54 
    """ 

クラス宣言。 docstringには、Pythonのコマンドラインコマンドのようなものがあります。これらのケアはdoctestsと呼ばれ、docstringのテストコードです。これについては後で詳しく説明します。

def __init__(self, unscaled=0, basic=None, mm=None, mils=None, units=None): 
     """Constructs a Length. 

     Default contructor creates a length of 0. 
     >>> Length() 
     Length(basic=0) 

     Length(<float>) or Length(<string>) creates a length with the given 
     value at the current scale factor. 
     >>> Length(1500) 
     Length(basic=1500) 
     >>> Length("1500") 
     Length(basic=1500) 
     """ 

     # Straight copy 
     if isinstance(unscaled, Length): 
      self._x = unscaled._x 
      return 

     # rest omitted 

これは初期化子です。C++とは異なり、1つしか取得できませんが、デフォルトの引数を使用して、いくつかの異なるコンストラクタが使用可能に見えるようにすることができます。

def _GetBasic(self): return self._x 
    def _SetBasic(self, x): self._x = x 
    basic = property(_GetBasic, _SetBasic, doc=""" 
     This returns the length in basic units.""") 

これはプロパティです。他のデータメンバーにアクセスするのと同じ構文を使用しながらゲッター/セッター関数を持つことができます。この場合、myLength.basic = 10myLength._SetBasic(10)と同じことを行います。これを行うことができるので、ではなく、のデータメンバのgetter/setter関数をデフォルトで記述する必要があります。データメンバーを直接操作するだけです。後でゲッター/セッター関数を使用する必要がある場合は、データメンバーをプロパティに変換することができ、モジュールのユーザーはコードを変更する必要はありません。 docstringはgetter/setter関数ではなくプロパティ上にあることに注意してください。

プロパティが読み取り専用の場合は、propertyデコレータとして使用して宣言することができます。上記のプロパティは読み取り専用されることになった場合たとえば、私が書くでしょう:プロパティの名前はgetterメソッドの名前であることを

@property 
    def basic(self): 
     """This returns the length in basic units.""" 
     return self._x 

注意を。デコレータを使用して、Python 2.6以降でsetterメソッドを宣言することもできます。

def __mul__(self, other): 
     """Multiplies a Length by a scalar. 

     >>> Length(10)*10 
     Length(basic=100) 
     >>> 10*Length(10) 
     Length(basic=100) 
     """ 
     if type(other) not in _NumericTypes: 
      return NotImplemented 
     return Length(basic=self._x * other) 

これは*演算子に優先します。特別な値NotImplementedを返すことで、この操作が実装されていないことをPythonに伝えることができます(この場合、文字列のような非数値型で乗算しようとすると)。

__rmul__ = __mul__ 

コードは他のものと同じ単なる値なので、あるメソッドのコードを別のメソッドに割り当てることができます。この行は、something * Lengthの操作でLength * somethingと同じコードが使用されていることをPythonに伝えます。 D on't epeat 私自身。

クラスが宣言されたので、私はモジュールコードに戻ることができます。この場合、モジュールとしてインポートされた場合ではなく、のみを実行するコードがあります。だから私は、次のテストを使用します。

if __name__ == "__main__": 

これは直接実行されている場合にのみ、その後ifでコードが実行されます。このファイルでは、私は、コードを持っている:

import doctest 
    doctest.testmod() 

これは、モジュール内のすべてのdocstringを経て、Pythonはそれらの後のコマンドで要求されますような行を探します。続く行は、コマンドの出力と見なされます。コマンドが何か他のものを出力すると、テストは失敗したと見なされ、実際の出力が表示されます。すべての詳細については、doctestモジュールのドキュメントを参照してください。

doctestについての最後のメモ:これらは便利ですが、最も多才なテストや徹底的なテストではありません。そのためには、unittests(unittestモジュール)を読んでみてください。

+0

あなたはこの投稿のクレジットを得られていないのは残念です。とても役に立ちました! –

+0

彼らは休憩です。 –

3

各pythonソースファイルはモジュールです。 「ヘッダ」ファイルはありません。基本的な考え方は、 "foo"をインポートすると "foo.py"(または以前コンパイルされたバージョン)からコードをロードするということです。 foo.whateverと言ってfooモジュールからstuffにアクセスできます。

Pythonコードで物事を整理するための2つの方法があるようです。一部のプロジェクトでは、すべてのモジュールがトップレベルにあるフラットなレイアウトを使用します。他のものは階層を使用します。 foo/bar/baz.pyをインポートするには、 "foo.bar.baz"をインポートします。階層レイアウトを持つ大きな問題は、適切なディレクトリに__init__.pyを入れることです(空でも存在するはずです)。インスタンスを作成するには

class MyClass(object): 
    def __init__(self, x): 
     self.x = x 

    def printX(self): 
     print self.x 

クラスは、次のように定義されてい

z = MyObject(5) 
+1

私の経験上、 '__init __。py'は*通常*空です。空であるとデフォルトで考えることが最善です。 –

+1

@Mike:はい、それは私の経験でもありますが、そこにコードがあることを知っているのは良いことです - 時にはこれを行う図書館があります。 '__init __。py'にコードしてください。 –

+0

\ _ \ _ init.py \ _ \ _は、\ _ \ _すべて\ _ \ _を定義する場所です。 –

0

あなたはどのような方法でそれを整理することができ、あなたのアプリケーションのための最も理にかなっています。私はあなたがしていることを正確には知らないので、最高の組織があなたのために何であるかを確信することはできませんが、必要に応じてインポートするだけで、

任意のファイルにクラスを定義することができ、(Javaとは異なり)スクリプト内にいくつでもクラスを定義できます。公式ヘッダーファイル(CやC++とは異なります)はありませんが、configファイルを使用してDBへの接続に関する情報を保存し、configparser(標準ライブラリ関数)を使用して整理することができます。

同じファイルに同じものを保存するのは理にかなっています。そのため、GUIを使用している場合はインターフェイス用に1つのファイルがあり、CLIを使用している場合は、ファイルがどのように編成されているかが重要ではなく、ソースがクラスと機能にどのように編成されているかが重要です。

0

これは、それを探す場所です:http://docs.python.org/reference/

まず、piphttp://pypi.python.org/pypi/pipをコンパイルしてインストールします。これは、Ubuntuのapt-getのようなものです。 pip install package-nameと入力して、ターミナル経由で実行します。それはパッケージのデータベースを持っているので、あなたは非常に簡単にそれをインストール/アンインストールすることができます。

import fooを実行すると、私が知る限りでは、現在のフォルダー内でfoo.pyが検索されます。そこになければ、egg(Pythonモジュールディレクトリで解凍されたフォルダ)を探し、それらをインポートします。 Pythonリファレンスで、この上

​​

読むより、私の唯一の先端がクラス関数でself引数を決して忘れないにある:

クラスとオブジェクトの定義については、ここでの基本的な例です。それはあなたに多くのデバッグ頭痛を保存します...

幸運!

0

Pythonプログラムの固定構造はありませんが、Djangoプロジェクトを例に取ることができます。 Djangoプロジェクトはsettings.pyモジュールで構成されています。グローバル設定(DB接続プロパティの例のような)は格納され、プラグ可能なアプリケーションです。各アプリケーションにはmodels.pyモジュールがあり、データベースモデルを格納し、おそらくは他のドメイン固有オブジェクトを格納します。すべての残りはあなた次第です。

これらのアドバイスはPythonに固有のものではありません。 C/C++ではおそらく同様の構造を使用し、XMLで設定を保持していました。ヘッダーを忘れて、設定を.pyファイルでプレーンに入れてください。それだけです。

関連する問題