2016-11-09 11 views
2

私はPythonで工場で作業しており、すべてのインポートを「プライベート」にしたいと考えています。Pythonで「プライベート」インポートを作成することは可能ですか

したがって、このような何か:この場合

from my_classes import MyClass1, MyClass2 

class MyFactory(object): 
    def __init__(self, class_name): 
     if class_name == "my_class_1": 
      return MyClass1() 
     elif class_name == "my_class_2": 
      return MyClass2() 

私は、呼び出し元がMyFactoryを使用することができる持ちたい、とMyClass1とMyClass2は表示されません。

私はPythonでプライベートなものはないと知っています。私が試した何 がfrom my_classes import MyClass1 as _my_class_1であるが、その後、私は今のメッセージConstant variable imported as non-constant

を取得し、私はこのようにそれを解決した:

class MyFactory(object): 
    def __init__(self): 
     do my init stuff here 

    def create_myclass_1(self): 
     from my_classes import MyClass1 
     return MyClass1() 

    def create_myclass_2(self): 
     from my_classes import MyClass2 
     return MyClass2() 

これは私にとって非常にPython的に見えるしませんが、私は間違っている可能性があります。

誰かがこれを行うより良い方法があるかどうか教えてもらえますか?

+0

あなたのソリューションに望ましくない副作用がある場合、より良い質問があります。これが事実でない場合、なぜそれを使用しないのですか? – Matthias

+4

クラスをプライベートにするという考えは、正直言ってPythonicではありません。単一のアンダースコアで始まるクラス名を与えるだけです: '_'。 –

+0

「from my_classes import MyClass1 as _MyClass1'」とメッセージに記載されています。 –

答えて

-1

あなたはちょうどあなたがもう少し魔法たいと、それはより多くのクラスのように扱われることを望むならば、あなたは__new__メソッドをオーバーライドすることができ、実際の工場機能別

def my_factory(class_name): 
    if class_name == "my_class_1": 
     return MyClass1() 
    elif class_name == "my_class_2": 
     return MyClass2() 

を作成することができます。

class FakeClass(object): 
    def __new__(cls, class_name): 
     if class_name == "my_class_1": 
      cls = MyClass1 
     elif class_name == "my_class_2": 
      cls = MyClass2 
     return object.__new__(cls) 
-1

あなたのモジュールの名前空間を汚染しないようにしたいので、それをインポートする人々はより簡単な時間を持っていますか?

この場合、魔法の変数__all__を使用してください。

__all__ = ['a', 'b'] 

def a(): 
    pass 

def b(): 
    pass 

def c(): 
    pass 

あなたはtest.pyとして上記の例を保存する場合は、from test import、あなたはa()b()の両方を実行することができますが、c()NameErrorが発生します。

+0

'__all__'はスターインポートにのみ影響します - ' from test import * '。 'import test'を実行しても、' test.c() 'を実行することができます。 –

+0

ああ、実際には分かりませんでした。この場合のSOのエチケットは何ですか?私の回答を削除/編集できますか? –

+0

答えを訂正できるのであれば理想的です。もしそうでなければ、それを削除してください。 –

関連する問題