2013-04-11 3 views
5

그래서 파이썬에서 싱글 톤에 대해 많은 증오가있었습니다. 나는 일반적으로 싱글 톤을 갖는 것이 인 것을 보았습니다.은 좋지 않지만, 데이터베이스 사용/쿼리와 같은 부작용이있는 것은 무엇입니까? 현재 연결을 다시 사용하여 다시 설정할 수있을 때 모든 간단한 쿼리에 대해 새 인스턴스를 만드는 이유는 무엇입니까? 무엇이 pythonic 접근/대안이 될 것입니까?Python에서 싱글 톤으로 DB-Connections 클래스

감사합니다.

답변

6

일반적으로 데이터베이스 (예 : MyWebServer의 인스턴스)를 사용하는 것을 나타내는 개체가 있으며 데이터베이스 연결을 해당 개체의 구성원으로 만듭니다.

대신 모든 논리가 어떤 종류의 기능 안에 있으면 해당 기능에 로컬로 연결하십시오. (이것은 다른 많은 언어들에서는 너무 일반적이지는 않지만 파이썬에서는 단일 생성기 함수로 다단계 상태 저장 작업을 마무리하는 좋은 방법이 종종 있습니다.)

모든 데이터베이스 항목이 장소에 대해, 싱글 톤 대신 글로벌 변수를 사용하십시오. 네, 전역 변수는 좋지 않지만, 싱글 톤은 마찬가지로 나쁘고 복잡합니다. 유용하지만 매우 드문 경우가 있습니다. (다른 언어 인 언어는 반드시 그런 것은 아니지만 파이썬 용입니다.) 그리고 글로벌을 없애는 방법은 디자인을 다시 생각해 보는 것입니다. 거기 당신은 효과적으로 (싱글) 개체로 모듈을 사용하는 좋은 기회가, 그리고 당신이 그것을 통해 생각한다면, 당신은 아마 그것을 마무리하는 것이 클래스 또는 함수와 함께 올 수 있습니다. 물론


모든 전역 클래스를 클래스 속성으로 이동하면 @classmethod은 다른 네임 스페이스로 전역을 제공합니다. 그러나 그들을 속성과 메소드로 이동시키는 것은 다른 이야기입니다. 이렇게하면 전달할 수있는 객체가 제공됩니다. 필요한 경우 객체를 2 개 (경우에 따라 0 개) 설정할 수도 있고 잠금을 설정하거나 직렬화 할 수도 있습니다.

많은 유형의 응용 프로그램 Qt GUI 응용 프로그램마다 정확히 하나의 MyQApplication이 있으며, 거의 모든 웹 서버에는 정확히 MyWebServer이 있습니다. 사용자가 무엇을 부르더라도 그 사실은 싱글 톤 또는 글로벌입니다. 그리고 원한다면 모든 것을 그 신 오브젝트의 속성으로 옮길 수 있습니다.

수 있습니다.은 그렇다고해서 일 필요가 없습니다. 함수 매개 변수, 지역 변수, 각 모듈에있는 전역 변수, 고유 한 인스턴스 속성을 갖는 기타 (거물이 아닌) 클래스 등이 있으며 각 값에 적합한 것을 사용해야합니다.

예를 들어, MyWebServer은 연결된 새 클라이언트마다 ClientConnection 인스턴스를 새로 만듭니다. SQL 쿼리를 실행하려고 할 때마다 연결을 MyWebServer.instance.db.execute으로 작성할 수 있습니다 ... self.dbClientConnection 생성자에 전달하면 각 연결은 self.db.execute이됩니다. 그래서 어느 것이 더 낫습니까? 만약 당신이 후자의 방법을 사용한다면 코드 확장과 리팩터링이 훨씬 쉬워집니다. 4 개의 데이터베이스에서로드 균형을 조정하려면 ClientConnection이 데이터베이스에 액세스 할 때마다 한 자리 (코드 번호 MyWebServerClientConnection으로 초기화 됨)에서 100 개가 아닌 코드를 변경하면됩니다. 모 놀리 식 웹 응용 프로그램을 WSGI 컨테이너로 변환하려는 경우에는 생성자를 제외한 ClientConnection 코드를 변경할 필요가 없습니다. 등등.

+0

일종의 app = class.webapp(); app.dbconn = class.dbconn()? 결국이 모든 것이 싱글 톤과 다른가요? – AlessandroEmm

+0

@AlessandroMeyer : 답변을 수정 해 드리겠습니다. – abarnert

1

당신이 객체 지향 접근법을 사용한다면, abamet가 데이터베이스 연결 매개 변수를 클래스 속성으로 붙이는 제안이 나에게 의미가있다. 그런 다음 클래스는 예를 들어 클래스의 모든 메소드가 self.db_connection을 참조하는 단일 데이터베이스 연결을 설정할 수 있습니다.

객체 지향 접근법을 사용하지 않으면 별도의 데이터베이스 연결 모듈이 기능적으로 동일한 기능을 제공 할 수 있습니다. 모듈을 사용하여 데이터베이스 연결을 설정하고 사용하려는 모든 곳으로 모듈을 가져옵니다. 예를 들어 코드에서 연결을 db.connection으로 참조 할 수 있습니다. 모듈은 사실상 싱글 톤이므로 모듈 코드는 첫 번째 가져 오기에서만 실행되므로 매번 동일한 데이터베이스 연결을 다시 사용하게됩니다.

+0

@JeffryFroman 모듈을 사용하여 내 문제는 내가 글로벌 일종의 아이디어를 좋아하지만 그것은 여전히 ​​싱글 톤 내부 상태. – AlessandroEmm

+0

어떻게 하시겠습니까? DB 연결 매개 변수의 "저장"을 해결 하시겠습니까? 같은 모듈에 두는 것만으로도 조금 엉망이되어 일반적인 설정과 같은 모듈에서 데이터베이스 모듈을 엄격하게 사용하게 만들 수 있습니다. – AlessandroEmm

관련 문제