2014-10-07 5 views
6

मैं सी # दुनिया से आ रहा हूं, इसलिए मेरे विचार थोड़ा कम हो सकते हैं। मैं पाइथन में डीआई करना चाहता हूं, हालांकि मैं पुस्तकालयों के साथ एक प्रवृत्ति को देख रहा हूं जहां वे सभी एक सेवा लोकेटर पर भरोसा करते हैं। यही है, MyClass का उदाहरण प्राप्त करने के लिए, आपको injectlib.build(MyClass) जैसे ढांचे पर अपनी ऑब्जेक्ट सृजन को बांधना होगा।क्या पाइथन एक सेवा लोकेटर पर भरोसा किए बिना निर्बाध रूप से कर सकता है?

from injector import Injector, inject 


class Inner(object): 
    def __init__(self): 
     self.foo = 'foo' 


class Outer(object): 
    @inject(inner=Inner) 
    def __init__(self, inner=None): 
     if inner is None: 
      print('inner not provided') 
      self.inner = Inner() 
     else: 
      print('inner provided') 
      self.inner = inner 


injector = Injector() 

outer = Outer() 
print(outer.inner.foo) 

outer = injector.get(Outer) 
print(outer.inner.foo) 

वहाँ पायथन में एक तरह से स्वचालित रूप से, जबकि पैरामीटर नाम के आधार पर निर्भरता प्रकार का निष्कर्ष निकालते एक वर्ग बनाने के लिए है -

यहाँ मैं क्या मतलब का एक उदाहरण है? इसलिए यदि मेरे पास my_class नामक एक कन्स्ट्रक्टर पैरामीटर है, तो MyClass का एक उदाहरण इंजेक्शन दिया जाएगा। कारण मैं पूछता हूं कि मैं नहीं देखता कि मैं किसी वर्ग में निर्भरता कैसे इंजेक्ट कर सकता हूं जो किसी तृतीय पक्ष लाइब्रेरी के माध्यम से स्वचालित रूप से बनाई जाती है।

उत्तर

6

आपके द्वारा स्पष्ट रूप से पूछे गए प्रश्न का उत्तर देने के लिए: नहीं, Python में my_class नामक पैरामीटर से स्वचालित रूप से MyClass ऑब्जेक्ट प्राप्त करने के लिए कोई अंतर्निहित तरीका नहीं है।

उस ने कहा, न तो "आपके ऑब्जेक्ट सृजन को ढांचे में बांधना" और न ही आपके द्वारा दिए गए उदाहरण कोड में बहुत पाइथनिक लगता है, और सामान्य रूप से यह प्रश्न भ्रमित है क्योंकि गतिशील भाषाओं में DI वास्तव में एक बड़ा सौदा नहीं है।

पायथन में DI के बारे में सामान्य विचारों के लिए मैं कहूंगा कि this presentation विभिन्न दृष्टिकोणों का एक बहुत अच्छा अवलोकन देता है। आपके विशिष्ट प्रश्न के लिए, मैं जो कुछ भी करने की कोशिश कर रहा हूं उसके आधार पर मैं दो विकल्प दूंगा।

यदि आप अपनी कक्षाओं में DI जोड़ने की कोशिश कर रहे हैं, तो मैं प्रस्तुति दिखाता हूं कि मैं प्रस्तुति में डिफ़ॉल्ट मानों के साथ पैरामीटर का उपयोग करूंगा। E.g:

import time 

class Example(object): 
    def __init__(self, sleep_func=time.sleep): 
     self.sleep_func = sleep_func 

    def foo(self): 
     self.sleep_func(10) 
     print('Done!') 

और फिर आप परीक्षण या जो भी हो, के लिए एक डमी नींद समारोह में जा सकते हैं।

आप डि के माध्यम से एक पुस्तकालय की कक्षाओं में हेरफेर करने की कोशिश कर रहे हैं, तो (नहीं कुछ मैं वास्तव में के लिए एक उपयोग के मामले कल्पना कर सकते हैं, लेकिन आप क्या कह रहे हैं की तरह लगता है) तो मैं शायद सिर्फ बंदर के लिए उन वर्गों पैच होगा जो कुछ भी बदलना चाहिए उसे बदलें। E.g:

import test_module 

def dummy_sleep(*args, **kwargs): 
    pass 

test_module.time.sleep = dummy_sleep 
e = test_module.Example() 
e.foo() 
+1

शानदार उत्तर! मैं पिछले कुछ महीनों से पाइथन को लगातार करने के बाद अब सहमत हूं कि जहां से मैं आया था (सी #) कि पाइथन को वास्तव में DI की आवश्यकता नहीं है। वास्तव में, मैं दोनों मिश्रण मिश्रण से नफरत है। –

संबंधित मुद्दे