1

同じディレクトリに 3 つの Python モジュールがあります。これらのファイルのうち 2 つに、私がアクセスしようとしているクラスがあります。モジュールの 1 つ (enum と呼ばれる) に次のコードがある場合、次のような印象を受けます。

class Directions:

    UP = 1
    DOWN = 2
    LEFT = 3
    RIGHT = 4

class Colors:
    RED = [255, 0, 0]

次のステートメントを使用できます。

from enum import Directions
from enum import Colors

次のようにクラスメンバーにアクセスできます。

foo = DOWN
bar = RED

ただし、このようにアクセスする必要があります

foo = Directions.DOWN
bar = Colors.RED

そうしないと、エラーが発生します。クラス名を指定せずに、import/from-import ステートメントを使用してクラス メンバーにアクセスする方法はありますか? それとも、別の方法で「列挙」を整理する必要がありますか?

4

4 に答える 4

5

そのクラス定義内以外のコードからクラス メンバーに直接アクセスすることはできません。

enum モジュールを次のように変更してみてください。

__all__ = ['UP', 'DOWN', 'LEFT', 'RIGHT', 'RED']

# Directions
UP = 1
DOWN = 2
LEFT = 3
RIGHT = 4

# Colors
RED = [255, 0, 0]

そして、from enum import *それらの変数にアクセスしたいモジュール内で使用します。

ここで定義する__all__必要はありませんが、とにかく使用することをお勧めします。の使用時にインポートされる名前を制御しますfrom foo import *

于 2013-04-05T22:46:27.693 に答える
3

それらを別の方法で整理します。あなたが求めていることを行う直接的な方法はありません。

一方、Directions.DOWNandの参照Colors.REDは非常に Pythonic です。これは明示的であり ( DOWNaDirectionではなく a をMattressStuffing参照)、名前空間を使用してデータを格納します (Colors.REDは とは異なりますAlerts.RED)。これらは良いことです。

于 2013-04-05T22:47:11.847 に答える
2

クラスがここに投稿したものと同じくらい単純である場合、それらが実際にクラスである必要はありません。ただし、取得したコードで必要なものを取得するには、次のようにする必要があります。

from enum import Directions
from enum import Colors

foo = Directions()    # This is called instantiation
foo.DOWN

bar = Colors()    # You can potentially instantiate as many of these as you want
bar.RED

rab = Colors()
rab.RED    # Try it, you'll see

クラスは、あなたが持っているように静的変数を保持することを実際には意図していませんが、このコードはそれがどのように機能するかです.

コードが機能するようにPythonを使用してはならない理由は、次の例によるものです。

class Directions:

    UP = 1
    DOWN = 2
    LEFT = 3
    RIGHT = 4


class Directions2:

    UP = 9
    DOWN = 8
    LEFT = 7
    RIGHT = 6

次に、インポートします

from enum import Directions
from enum import Directions2

次に を使用しようとするfoo = DOWNと、Python はどのDOWNように話しているかを知ることができますか? この基本的な概念の専門用語は名前空間です。

于 2013-04-05T22:59:16.453 に答える
1
from enum import Directions

Directionsこれにより、モジュールから名前がインポートされますenum。内部インポート関数が実際にローカル変数をそのようにインポートされたものに設定するという内部で何が起こるかDirections。特に、他のローカル変数は設定されません。これがまさにこのfrom..import構文を使用する理由であり、設定される名前を完全に制御できます。

したがって、そのように使用すると、変数DOWNを取得してRED設定することはできません。

それらを使用したい場合は、それらを直接インポートする必要があります。つまりfrom <something> import DOWN, REDfrom <something> import *単にすべてをインポートしたい場合 (通常は推奨されません)。

さて、その<something>部分です。タイプのプロパティをインポートすることはできないためenum、何らかの方法でモジュールを変更する必要があります。詳細な可能性の 1 つは、各タイプを個別のモジュールに変更DirectionsするColorsことですfrom enum.Directions import DOWN

他の可能性は、これらの変数を enum モジュールで直接公開することです。たとえば、次のようになります。

class Directions:
    UP = 1
    DOWN = 2
    LEFT = 3
    RIGHT = 4

UP = Directions.UP
DOWN = Directions.DOWN
LEFT = Directions.LEFT
RIGHT = Directions.RIGHT

もちろん、そのDirectionsタイプが必要かどうかについても議論できます。ただし、通常は、実際にインポートして、etc.Directionsを使用して各列挙値を明示的に指定するDirections.UPことで、参照している列挙型の種類を実際に知ることができます。

于 2013-04-05T22:48:12.730 に答える