2016-07-14 3 views
0

장고 APP새로운 객체 인스턴스

내가 장고에 전자 메일을 전송하는 인터페이스가 모든 호출 : 나는 예에 대한 또 다른 interafces이

from my_app.utils import com 

com.mail.email_category1(subject, template, ...) 
... 
com.mail.email_category2(subject, template, ...) 

합니다. SMS를 들어

com.sms.sms_category1(template, ...) 

my_app.utils.com 거기에 정의 된 함수이다 :

# my_app.utils.com 
mail = CommunicationMail() 
sms = CommunicationSms() 
... 

와 범주는 상기 클래스의 방법이다.

질문

은 내가 com.mail.email_category...를 호출 할 때마다 CommunicationMail의 새로운 인스턴스를 호출 할 수 있습니까? 문제는 그것이 매 호출마다 동일한 객체 인스턴스라는 것입니다. 작업으로 병렬로 실행될 때 속성 및 중복을 공유합니다.

+1

여기에 정보가 충분하지 않습니다. CommunicationMail의 정의와 정확히 어디에 전화를 걸 었는지 보여 주어야합니다. –

+0

@DanielRoseman :'com.mail .... '을 호출 할 때마다 나는'CommunicationMail'을 호출합니다. 왜냐하면'mail'은'com' 모듈에서 가변적이고'mail = CommunicationMail()' – morning

+1

글쎄요, 서로 전혀 뒤지지 않습니다. 'mail'을 이미 CommunicationMail의 인스턴스로 정의했다면,'mail'을 참조 할 때마다 CommunicationMail을 호출하지 않을 것입니다. 그러면 동일한 인스턴스를 얻을 수 있습니다. 그러지 마라. –

답변

1

이 것 일 권장 구조 :

from my_app.utils import com 
com.Mail().email_category1(template, ...) 

my_app.utils.com은 다음과 같습니다

Mail = CommunicationMail 

경우 정말com.mail.email_category1 표기법을 유지하고 싶어, 파이썬은 (__getattr__ documentation)이라는 동적 언어 인 물론, 당신을 할 것입니다 :

# my_app.utils.com 

class CommunicationMailFactory: 
    def __getattr__(self, name): 
     instance = CommunicationMail() 
     return getattr(instance, name) 

mail = CommunicationMailFactory() 

을하지만 첫 번째 방법을 사용! "왜,"물어보십시오.

당신이하고있는 일을 분명하게 해줍니다 : 새로운 인스턴스를 인스턴스화하고 메소드를 호출하고 있습니다. 이것은 __getattr__ 해커가 명확하지 않습니다.

둘째로, 새로 인스턴스화 된 인스턴스를 변수 mail1에 할당 한 다음 mail1.email_category1(subject, template, ...) 또는 무엇이든 호출 할 수 있습니다. 당신은 그러한 정상적인, 예상 된 융통성을 가지고 있지 않습니다. __getattr__ hackery.

0

파이썬 모듈은 싱글 톤이므로 한 번만 가져 오므로 mail = CommunicationMail()이 한 번 실행됩니다.

을 수행 할 수 있습니다

from my_app.utils import com 

com.CommunicationSms().sms_category1(template, ...)