2016-11-09 5 views
2

저는 파이썬으로 공장에서 일하고 있으며 모든 가져 오기를 "비공개"로하고 싶습니다.파이썬에서 "개인"가져 오기를 만들 수 있습니까?

그래서 이런 식으로 뭔가 :

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() 

이 경우 내가 좋아하는 것은 호출자가 MyClass1 및 MyClass2의 참조 MyFactory를 사용하지 할 수 있습니다합니다.

저는 파이썬에서 개인적인 것이 없다는 것을 알고 있습니다. 내가 시도하는 것은 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() 

이것은 나에게 매우 파이썬 보이지 않는,하지만 내가 잘못 될 수 있습니다.

누군가 더 좋은 방법이 있는지 알려 줄 수 있습니까? 조금 더 매직 원하고 그것이 클래스처럼 더 취급 할 경우 그냥, 또는 실제 공장을 기능

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

를 만들 수

+0

솔루션에 원하지 않는 부작용이있는 경우 더 좋은 질문이 될 수 있습니다. 이것이 사실이 아니라면 왜 그것을 사용하지 않습니까? – Matthias

+4

클래스를 비공개로 만드는 전체적인 개념은 Pythonic이 아닙니다. 솔직히 말해서. 하나의 밑줄로 시작하는 클래스 이름을 지정하십시오 :'_'. –

+0

'my_classes from MyClass1 as _MyClass1'을 사용하라는 메시지가 표시됩니다. –

답변

-1

, 당신은 __new__ 방법을 대체 할 수 있습니다.

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__을 사용하십시오. 당신이 test.py, 다음 from test import로 위의 예를 저장하면

__all__ = ['a', 'b'] 

def a(): 
    pass 

def b(): 
    pass 

def c(): 
    pass 

, 당신은 모두 a()b()하지만 c()NameError을 올릴 실행할 수 있습니다.

+0

'__all__'은'from test import *'에만 영향을줍니다. 'import test'를한다면, 여전히'test.c()'를 할 수있을 것입니다. –

+0

오, 사실 전혀 몰랐습니다. 이 경우 에티켓은 무엇이며, 내 대답을 삭제하거나 편집합니까? –

+0

답변을 수정할 수 있다면 이상적입니다. 그렇지 않다면, 그냥 삭제하십시오. –

관련 문제