2016-07-28 3 views
1

다음은이 link이고 Metaclass를 사용하여 싱글 톤 클래스를 만들려고합니다. 그러나이 싱글 톤 클래스에 대해 내부 조정을하고 사용자가 다른 클래스를 사용하기를 원합니다 (MySingleton(__Singleton)이라고합시다). 그래서 비공개로 만들기로했지만 다음과 같은 오류가 발생합니다.Python : 두 개의 밑줄이있는 클래스

enter image description here

나의 유일한 목적은 외부에 사용되는 __Singleton을 방지하는 것입니다. 이것을 어떻게 할 수 있습니까?

별도의 메모에서 클래스에 밑줄을 두 개 사용하는 것이 좋습니다.

+1

'__Singleton'이 (가) 무엇이 아닌 곳에서 사용되는 것을 막고 싶습니까? –

+0

내 모듈 외부. MySingleton만이 이것을 사용하고자하는 사람들이 접근 할 수 있어야합니다. –

+0

선행 이중 밑줄은 범용 개인 정보 표시가 아닙니다. 그들은 하나의 밑줄보다 사적인 것을 만들지 않습니다. – user2357112

답변

3

클래스 내에서 __Singleton 식별자는 mangled이됩니다. 이름 맹 글링은 클래스 내부에서만 발생하기 때문에 (외부가 아닌) 문제가 발생합니다. 따라서 __Singleton을 클래스 이름으로 사용하면 클래스 스위트에 속할 때 __Singleton과 다른 것을 의미합니다.

형태 __spam의 상관 식별자 (적어도 두 개의 주요한 밑줄, 최대 하나의 후단에 밑줄)를 텍스트 클래스 이름이 박탈 밑줄 (들)과 현재의 클래스 이름 _classname__spam로 대체된다. 이 mangling은 클래스의 정의 내에서 발생하는 한 식별자의 통어 위치에 상관없이 수행됩니다. 그것은

이 ... 서브 클래스는 개체 간 메서드 호출을 파괴하지 않고 메소드를 오버라이드 (override)시키는 데 도움이 있기 때문에 맹 글링의 주요 원인이라고

참고. 또한

:

이 ... 서브 클래스 등으로

에 의해 정의 된 이름을 가진 이름의 이름 충돌을 피하기 위해 정말 선두와 클래스가 어떤 이유가없는 double은 이름에서 밑줄을 긋습니다 (클래스 이름과 충돌하는 intraclass 메소드 호출의 가능성은 없습니다). 단일 밑줄은 그 클래스 사용하지 않도록 사용자에게 충분한 신호 :

... 밑줄로 시작 이름 (예 : _spam을)의 비 공공 부분으로 취급되어야한다 API (함수, 메소드 또는 데이터 멤버이든지간에). 구현 세부 사항으로 간주되어야하며 사전 통지없이 변경 될 수 있습니다.


내가 조언하지,하지만 당신이 정말로가 작업 할 경우, 당신은 아마 클래스 조회 globals를 사용할 수 있습니다

class __Foo(object): 
    def __init__(self): 
     super(globals()['__Foo'], self).__init__() 

f = __Foo() 
print f 
+0

왜 그렇게하는 것이 바람직하지 않습니까? –

+1

@ PankajSinghal - 그것은 전혀 이득을 얻지 못하는 여분의 타이핑과 이상한 (다소 혼란스럽고 비효율적 인) 내포물입니다 ... – mgilson

1

두 개의 선행 밑줄이있는 클래스 정의 내의 모든 이름이 잘리지 않으므로 __Singleton_Singleton__Singleton이됩니다. 명확하게, 일부 클래스는 공개적으로 사용하도록되어 있지 않습니다. 하나의 밑줄을 사용하십시오.

+0

심지어'_Singleton__Singleton'도 작동하지 않습니다. 그냥 시도해보십시오 –

+0

정말'class _Singleton__Singleton (type) : ... '을 시도 했습니까? – Daniel

+0

아니, 나는'super (_Singleton__Singleton, cls)'을 시도했다 –

1

파이썬이 없습니다를 private variables; 그들은 모두 외부에서 접근 가능합니다.

개체 내부를 제외하고는 액세스 할 수없는 "개인"인스턴스 변수는 Python에 존재하지 않습니다. 그러나 대부분의 파이썬 코드 뒤에는 규칙이 있습니다. 밑줄 (예 : _spam)이 붙은 이름은 함수, 메소드 또는 데이터 멤버 이건간에 API의 비공개 부분으로 처리되어야합니다. . 구현 세부 사항으로 간주되어야하며 예고없이 변경 될 수 있습니다.

파이썬 쿡북은 다른 클래스에 의해 상속되어 싱글 톤이 될 수있는 Singleton class을 제공합니다.