2017-10-26 4 views
-1

私は、共通のデータ構造内で比較およびソートできるクラスを作成しました。クラスinitメソッドを使用するPythonクラス定数?

私はクラスが取ることができる最大値と最小値に対して2つのクラス定数を作りたかったということです。だから私はちょうど事をMyClassのインポートと

obj = MyClass.MY_MAX_CONSTANT 

を書いて、この値を呼び出すことができ、これらの定数を初期化するコンストラクタまたはのinitメソッドを呼び出すことが許可されていないことです。

これは静的として宣言され、うまくいくはずですが、コンストラクタ/ initメソッドを使用してPythonでクラス/静的定数をどのように行うことができるのか分かりません。グーグル・グーグルではなく、定数を作るための一般的なレシピや、プロパティを作るための提案があります。

私は間違いなくそれを変更していないので定数値を変更しないようにする必要はありません。各定数のためのいくつかの機能を使用することにより、

class MyClass(object): 
    MY_MAX_CONSTANT = MyClass(10,10) 
    MY_MIN_CONSTANT = MyClass(0,0) 

    def __init__(self, param1, param2): # Not the exact signature, but I think this works as an example 
     # We imagine some initialization work here 
     self.x = param1 
     self.y = param2 


    # SORT FUNCTIONS 
    def __cmp__(self, other): 
     # Implementation already made here 

    def __eq__(self, other): 
     # Implementation already made here 

    def __ne__(self, other): 
     # Implementation already made here 

    def __ge__(self, other): 
     # Implementation already made here 

    # And so on... 

2回目の試行:

私の最初の試みでした

class MyClass(object): 
    def __init__(self, param1, param2): # Not the exact signature, but I think this works as an example 
     # We imagine some initialization work here 
     self.x = param1 
     self.y = param2 
     MY_MAX_CONSTANT = None 
     MY_MIN_CONSTANT = None 

    @staticmethod 
    def get_max(self): 
     if not MyClass.MY_MAX_CONSTANT: 
      MyClass.MY_MAX_CONSTANT = MyClass(10,10) 
     return MyClass.MY_MAX_CONSTANT 

    @staticmethod 
    def get_min(self): 
     if not MyClass.MY_MIN_CONSTANT: 
      MyClass.MY_MIN_CONSTANT = MyClass(0,0) 
     return MyClass.MY_MIN_CONSTANT  

    # SORT FUNCTIONS (I'm not writing them twice for spacing) 

しかし、私は唯一の2つの定数を作るための奇妙な機能のメカニズムを避けたかったです。

私はもっと自然な感じがするので、私はクラス内で定数が好きですが、私はアドバイスや提案を聞いています。誰かが私に良いpythonicソリューションを指摘できますか?

おかげ

+2

"これらの定数を初期化するコンストラクタまたはinitメソッドを呼び出すことはできません。"誰がそれを許していないのですか?あなたの先生? Pythonはそれを許しますが、クラスが実際に存在すると定数を作成しなければなりません。クラスの中身はまだ存在しません。 – user2357112

+0

定数はどこで定義する必要がありますか? initは再帰的に自分自身を呼び出す良い場所のようには見えません – madtyn

答えて

2

はあなたの定数を追加は、あなたのクラスを作成した後、あなたはより多くのクラスを追加することが許可されている属性:

class MyClass: 
    # ... 

MyClass.MY_MAX_CONSTANT = MyClass(10, 10) 
MyClass.MY_MIN_CONSTANT = MyClass(0, 0) 

class文が実行を完了した場合にのみバインドされ、使用可能なクラスのオブジェクトでありますMyClassという名前にこの時点までにインスタンスを作成することはできません。

+0

ありがとう。これは機能します。私の唯一の疑問は、クラスをインポートするときにインポート・センテンスがどのように機能するかです。それはMyClassに関連するすべてのものを適切なモジュールからもたらしますか? Pythonはどのようにインポートを停止するのかを知っていますか?どのように私は知っていますか? (私は、クラスのインポートを宣言の下にインデントされたコンテンツのみをインポートしたと思っていたと知るまで) – madtyn

+1

インポートは、初めてモジュールのすべてのトップレベルコードを実行します。残りの部分はオブジェクトへの名前のバインドです。 'sys.modules ['modulename']'は中央モジュールオブジェクトであり、そこからインポートすることができるさまざまな特定の名前にバインドされた名前、またはモジュールオブジェクト自体への参照のみを取得します。だから、すべてが記憶に存在します。 –

関連する問題