2

ディレクトリ名、ファイル名、およびクラス名がどのように連携するのか混乱しています。

これは私が現時点で持っているものです

  app.py
  database/
     client.py
     staff.py
     order.py

内部には、データベース モデル (MVC) として機能するclient.pyという単一のクラスがあります。client私の他のファイルと同じです: hasstaff.pyというクラスstaffがあります。order.pyorder

次に、app.py私は:

  from database import client as model
  c = model.client()

そして、私は混乱します。理想的な世界では、これが私がやりたいことです:

  1. データベース モデル クラスは、それぞれのディレクトリ内の別のファイルに保管してください。

  2. 次のように使用します。

  c = model.client()
  o = model.order()
  s = model.staff()

これを行う唯一の方法は、すべてのクラスを という単一のファイルに入れ、model.pyこれをルートに保存することです。

ここで非常に基本的なものが欠けていると確信しています。

4

1 に答える 1

4

Python には、コンテンツをインポートする基本的な方法が 2 つあります。モジュールとパッケージ。


モジュールは、インクルード パスorder.py上の単純な python ファイルです。

order.py がfooという名前のクラスを定義している場合、そのクラスへのアクセスは次の方法で行うことができます。

import order
o = order.foo()

元の質問の構文を使用するには、 model.pyファイルに次の属性があることを確認する必要があります: [client, staff, order]

ただし、これは通常、それらを 1 つのファイルに配置することを意味します。これはあなたが避けようとしているものです。


パッケージは、その中に__init__.pyがあるディレクトリです。init .pyはパッケージを初期化し (つまり、最初のインポート時に実行されます)、そのディレクトリ内にモジュールまたはサブパッケージを含めることができます。

model
    __init__.py
    client.py
    staff.py
    order.py

そうすれば、サブモジュールのいずれかにアクセスするには、次のように言うだけです。

import model.client

ただし、それは単にモジュールをインポートするだけです。モジュールの属性をインポートしていません。したがって、モジュール内のクラスにアクセスするには、次のように指定する必要があります。

import model.client
o = model.client.clientclass()   

これは少し面倒ですが、非常によく整理されています。


両方の長所 (パフォーマンスは大した問題ではありません):

__init__.pyに次のコードを入力すると:

from .client import clientclass as client
from .staff import staffclass as staff
from .order import orderclass as order

次に、すべてのクラスを自動ロードし、次のようにアクセスできます。

import model
c = model.client()
s = model.staff()
o = model.order()

最終的には、非魔法の方法に固執する方が簡単かもしれません。

import model.client
o = model.client.clientclass()   

――ガホア

于 2009-02-18T16:37:41.170 に答える