2012-04-29 4 views
4

나는이 클래스에 대해 하나의 객체 (obj1)를 만들었습니다.이 객체 이외의 객체를 만들고 싶지 않습니다. 어떤 몸이라도이 클래스에 대해 하나 이상의 객체를 만들고 싶다면 첫 번째 객체 만 참조해야합니다 (하나 이상의 객체를 만드는 대신). 이렇게하려면? 아래 코드를 참조하십시오.파이썬에서 객체 생성을 피하는 방법은 무엇입니까?

class MyClass: 
    def __init__(self): 
     pass 
obj1=MyClass()//create object 
obj2=MyClass()//avoid creation and refer obj2 to obj1 
obj3=MyClass()//avoid creation and refer obj3 to obj1 
+1

확인이 답변 http://stackoverflow.com/questions/6760685/creating-a-singleton 파이썬 싱글 톤에 대한 -in-python –

+0

[파이썬에서 싱글 톤을 정의하는 간단하고 우아한 방법이 있습니까?] (http://stackoverflow.com/questions/31875/is-there-a-simple-elegant- way-to-define-singleton-in-python) –

+2

주제에서 벗어나지 만, 파이썬 주석에서 시작은 has h 문자 (#). – martineau

답변

7

그래서 당신이 뭔가 싱글 틱 싶어? 그런 다음 객체를 사용하지 마십시오. 함수를 별도의 모듈 (.py 파일)에 넣고 모듈 범위 (예 : 전역 변수)에 변수를 저장하면 스레드 안전이 필요없는 경우 원하는 것을 수행 할 수 있습니다. 기억하십시오 : 자바가 아니며 모든 것에 클래스를 사용하는 것은 길은 아닙니다.

당신이 싱글을 원하는 경우에
class MyClass: 
    def __init__(self): 
     if getattr(self.__class__, '_has_instance', False): 
      raise RuntimeError('Cannot create another instance') 
     self.__class__._has_instance = True 

, 당신은 하나의 객체를 생성하고 글로벌 즉, 만들 수있는 Python and the Singleton Pattern보고 Is there a simple, elegant way to define singletons?

+4

다른 문제에 관해서도 같은 맥락에서 : [Python Is Not Java] (http://dirtsimple.org/2004/12/python-is) -not-java.html). – delnan

+1

@delnan 그것은 굉장했습니다. 좋은 코멘트 –

+0

내 +1은 클래스 대신 모듈을 사용합니다. 클래스와 인스턴스는 모듈과 비교하여 더 많은 인스턴스를 생성 할 수 있도록 실제로 만들어졌습니다. – pepr

1

있습니다

그러나, 여기에 하나 개의 인스턴스 만 허용 일부 코드는 코딩중인 모든 파일이 하나의 파일에 포함되거나 별도의 모듈에 넣고 가져올 수있는 경우 모듈의 최상위 오브젝트를 사용하십시오.

+0

이것은 해결책이 아닙니다. 싱글 톤 패턴은 프로그램의 다른 부분을 인식하지 못하는 코드가 * 다른 싱글 톤 객체를 만드는 경우 실제로 다른 특별한 방법없이 단 하나의 코드 만 공유한다는 것을 의미합니다. 단일 객체를 공유하는 계약이 다른 코드가 다른 인스턴스를 작성하는 것을 막지는 못합니다. – pepr

3

여기에 간단한 방법 - 클래스 이름 숨기기 : - 코멘트에 지적하지만, 불가능하지

class obj: 
    pass 

obj = obj() 

class obj 인스턴스가 더 나중에 만들 어렵게 만들 것입니다.

또 다른 대안, 최초 사용 후 클래스를 삭제 :

class MyClass: 
    def method(self): print 'spam' 

obj1 = MyClass() 
del MyClass 
obj1.method() # show instance still exists 
obj2 = MyClass() 

출력 :

spam 
Traceback (most recent call last): 
    File "noclass.py", line 7, in <module> 
    obj2 = MyClass() 
NameError: name 'MyClass' is not defined 
+3

'obj2 = type (obj)()'. 실제로, 이와 같은 코드는 메타 프로그래밍 코드에서 때때로 좋은 의도로 (그리고 의도적으로) 사용됩니다. – delnan

+0

네, ORM 코드와 파이썬 - 다른 언어 인터페이스에서 이와 같은 미친 것들을 보았습니다. –

관련 문제