2009-10-30 8 views
5

मैं कारखाने की उचित अवधारणाओं को समझने के लिए प्रतीत नहीं कर सकता।पायथन और कारखानों

क्या कोई मुझे एक साधारण परीक्षण कोड करने में मदद कर सकता है? मैंने इंटरनेट पर कुछ ग्रंथ पढ़े और इसे उसी तरह कोड नहीं कर सकते। वास्तव में मैं प्रक्रिया को समझ नहीं सकता। कोड कॉपी करना आसान है, लेकिन मुझे यह जानने की जरूरत है कि यह क्यों काम नहीं करेगा।

class Factory: 

    def __init__(self): 
     self.msg = "teste" 

    def fabricateAnotherObject(self,obj,**kwargs): 
     return apply(obj,**kwargs) 

class testClass: 
    def __init__(self,nome,salario,endereco): 
     self.nome = nome 
     self.salario = salario 
     self.endereco = endereco 

    def __str__(self): 
     return "Nome: " + str(self.nome) + "\nEndereco: " + str(self.endereco) + "\nSalario: " + str(self.salario) 

a = Factory() 
emp = a.fabricateAnotherObject(testClass,"George",2000,"Three Four Five Avenue") 
print str(emp) 
+0

'लागू()' का उपयोग गलत है (यह कीवर्ड तर्क नहीं लेता है), लेकिन किसी भी मामले में 'लागू() 'को' obj (** kwargs) 'वाक्यविन्यास का उपयोग बहिष्कृत किया गया है। – jfs

उत्तर

13

आपका कोड काउंटर-उत्पादक है (क्षमा करें, मुझे यह कहना होगा)।

फैक्ट्री की भावना यह है कि आपको अपनी निर्मित वस्तु की कक्षा को उस स्थिति में नहीं जानना है जहां आप इसे बनाते हैं।

कारण यह है कि ऑब्जेक्ट सृजन ऑब्जेक्ट उन्मुख अमूर्तता में एक अंतर बनाता है। वस्तु बनाने में आपको ठोस होना चाहिए। लेकिन कभी-कभी आप कुछ व्यवहार के साथ एक वस्तु बनाना चाहते हैं, लेकिन किसी और को यह तय करना चाहिए कि वह कौन सी ठोस वर्ग है।

उदाहरण के लिए आपको 100 स्थानों में एक प्रकार का ऑब्जेक्ट बनाना होगा। लेकिन बाद में आप यह पता लगा सकते हैं कि आपको कक्षा बदलनी होगी - आपको उन सभी जगहों को बदलना होगा।

कारखाना एक ऐसी जगह को परिभाषित करके इस आवश्यकता को खत्म कर देगा जिसे आपको बदलना चाहिए।

सरल कारखाना होगा:

def fabricateAnotherObject(self, **kwargs): 
    return testClass(**kwargs) 
बेशक

, इस कुछ स्थितियों में थोड़ी मदद की हो सकती है। तो कुछ कारखानों डीबी या कुछ अन्य विन्यास से कक्षा के नाम भी लोड कर सकते हैं। लेकिन सबसे सरल समाधान ऑब्जेक्ट का एक हार्ड-कोडेड निर्माण है - जब आप हमेशा इस विधि को कॉल करना चुनते हैं तो केवल इस विधि को हमारे उदाहरण में बदला जाना चाहिए।

(एक डाटाबेस की आवश्यकता के बिना) एक कुछ और अधिक गतिशील समाधान:

class Factory(object): 
    def __init__(self, theClass): 
     self.theClass = theClass 
    def create(self, **kwargs): 
     self.theClass(**kwargs) 

myFactory = Factory(testClass) 

myFactory उदाहरण सही उदाहरणों बनाने के लिए विभिन्न स्थानों में इस्तेमाल किया जा सकता। समस्या यह है कि, मेरे फैक्ट्री को कैसे शुरू करें - कुछ विशेष मॉड्यूल में ??

+0

बेशक मेरे निर्मित उदाहरण में, आपको फैक्ट्री क्लास की आवश्यकता नहीं है - एक साधारण फैक्ट्री फ़ंक्शन पर्याप्त होगा, क्योंकि आप देख सकते हैं कि स्वयं-पैराम का उपयोग नहीं किया जाता है। – Juergen

+0

जुर्गेन। यही वही है जो मुझे चाहिए। मुझे आपके शब्दों के लिए धन्यवाद कहना चाहिए। यहां पोस्ट किया गया यह सिर्फ एक उदाहरण है। –

+0

ओह बस एहसास हुआ कि वस्तु तय है। मैं थोड़े से चुने जाने की जरूरत है। मैं कुछ सोचूंगा। धन्यवाद: डी –

0

आपका निर्माण करना विधि इस तरह दिखना चाहिए:

def fabricateAnotherObject(self, obj, *args): 
     return apply(obj, args) 

लागू() आर्ग की एक सूची में ले जाता है। अपने fabricateAnotherObject विधि में * तर्कों को ले कर, आप obj से परे सभी पैरामीटर को एक सूची के रूप में उपभोग करते हैं जिसे लागू करने के लिए पारित किया जा सकता है()।

+0

डाउनवोट: यह एक टिप्पणी है, उत्तर नहीं – g33kz0r

4

फैक्टरी पैटर्न प्रोग्रामिंग भाषाओं के लिए है जो फ़ंक्शंस (और कक्षाओं) को प्रथम-क्रम मान (जैसे सी ++ या जावा) के रूप में अनुमति नहीं देता है।

विचार यह है कि आप कुछ फ़ंक्शन (या विधि या कन्स्ट्रक्टर) के लिए तर्क के रूप में "फैक्ट्री" वर्ग का एक उदाहरण पास करते हैं, जिसका उपयोग तब नए ऑब्जेक्ट उदाहरणों के उत्पादन के लिए किया जाता है (आमतौर पर ये कुछ विशिष्ट उप-वर्ग के उदाहरण होते हैं एक सुपरक्लास जिसे अग्रिम में जाना जाता है)।

पायथन में, आप बस कक्षा को पास कर सकते हैं (क्योंकि कक्षाएं (और फ़ंक्शंस) भी ऑब्जेक्ट्स हैं)।

0

docs.python में type() भी देखें।org/पुस्तकालय/कार्य:

प्रकार (नाम, ठिकानों, dict)

वापसी एक नए प्रकार वस्तु। यह अनिवार्य रूप से कक्षा विवरण का एक गतिशील रूप है। नाम स्ट्रिंग कक्षा का नाम है और __name__ विशेषता बन जाती है; बेस टुपल बेस क्लास को आइटम करता है और __bases__ विशेषता बन जाता है; और dict dictionary नामस्थान है जिसमें कक्षा निकाय के लिए परिभाषाएं हैं और __dict__ विशेषता बन जाती हैं। उदाहरण के लिए, निम्न दो बयानों समान प्रकार वस्तुओं को बनाने: कारखानों (दृढ़तापूर्वक विशेष dicts के बहुत सारे निर्माण) में से एक प्रयोग के साथ

class X(object): 
    a = 1 
X = type('X', (object,), dict(a=1)) 

एक छोटी असली कार्यक्रम के लिए, ofc2.py देखते हैं।
विशेषज्ञ, अधिक उदाहरण कृपया?

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