2010-09-16 14 views
7

ट्यूटोरियल से: "एक वर्ग परिभाषा निष्पादन योग्य कथन है।"सशर्त कक्षा निर्माण (पायथन)

क्या निम्न लिपि में अनुशंसित है?

my_switch = False 
if my_switch: 
    class Hello: 
     def __init__(self): 
      self.greeting = "Hello!" 

else: 
    class Hello: 
     def __init__(self): 
      self.greeting = "Salut!" 
+0

क्षमा करें, मैं पूछने के लिए अगर यह अभ्यास की सिफारिश की थी मतलब है। प्रश्न अपडेट किया गया। – ash

+1

अधिक जटिल मामलों के लिए, अनुशंसित अभ्यास [मेटाक्लासस] (http://www.ibm.com/developerworks/linux/library/l-pymeta.html) होगा, इसलिए आप स्वयं को दोहराएं नहीं। स्थानीयकरण के विशिष्ट मामले के लिए –

+1

बीटीडब्ल्यू, मैं मानक पुस्तकालय में 'gettext' मॉड्यूल की अनुशंसा करता हूं। इसका उपयोग करके आपके उदाहरण को एक ही वर्ग द्वारा 'self.greeting = _ ("हैलो")' के साथ संभाला जा सकता है। – martineau

उत्तर

9

तुम भी (... ध्यान दें कि आपके कोड की जरूरत है लोअर केस कक्षा कीवर्ड)

class Hello: 
    def __init__(self): 
     self.greeting = "Hello!" 

class Salut: 
    def __init__(self): 
     self.greeting = "Salut!" 

if my_switch: 
    Hello = Salut 

कर सकते हैं

+0

धन्यवाद, मेरा कोड अपडेट किया गया। यह एक बहुत अच्छी बात है! – ash

+0

-1 @ जैसी यह तीन कारणों से गलत है। 1) यदि आप इसका उपयोग नहीं कर रहे हैं तो कक्षा को परिभाषित क्यों करें? 2) जैसा कि मूल रूप से था, यह स्पष्ट था कि पहचानकर्ता 'हैलो' दो अलग-अलग वर्ग वस्तुओं में से एक को संदर्भित कर सकता है __at निर्माण समय__। अब, मुझे पढ़ने की जरूरत है इसे देखने के लिए कोड में आगे बढ़ें क्योंकि यह बिल्कुल स्पष्ट नहीं है। 3) 'my_switch == True' के साथ किए गए किसी भी डिबगिंग' वर्ग 'के रूप में' सलात 'आउटपुट करेगा। यह अन्य लोगों को भ्रमित कर देगा। – aaronasterling

+0

मेरा मतलब था कि उदाहरण के तौर पर यह दर्शाता है कि वर्ग पी में प्रथम श्रेणी की वस्तुएं भी हैं ython, उपयोग करने के लिए एक वास्तविक कोड के रूप में नहीं। बेशक अनुवादों जैसी चीजों के लिए आप गेटटेक्स्ट या किसी भी तरह के किसी भी तरह का उपयोग करने जा रहे हैं। –

5

हाँ, कोड मान्य है। लेकिन क्यों न सिर्फ पता लगाने के लिए कोड चलाएं?

आप फ़ंक्शन परिभाषाओं के साथ भी ऐसा कर सकते हैं।

+1

आपका पहला कथन थोड़ा संदिग्ध है। यदि आप सामान्य रूप से उस दृष्टिकोण को लेते हैं, तो आप पाएंगे कि, सी में, उदाहरण के लिए, नकारात्मक बदलाव अक्सर ऐसा कुछ करने लगते हैं जो उपयोगी हो सकता है, लेकिन यदि आप इसके बजाय सी मैनुअल पढ़ते हैं तो आप पाएंगे कि भाषा वास्तव में इसका समर्थन नहीं करती है । मैं मानता हूं कि 'इसे आज़माएं और देखें' पायथन में बहुत उपयोगी है, लेकिन मैं निश्चित रूप से पूछने में मूल्य देख सकता हूं, "यह काम पर प्रतीत होता है, लेकिन क्या यह * अनुशंसित * है? क्या यह पाइथन के भविष्य के संस्करणों में विफल होने की संभावना है , या अन्य प्लेटफार्मों पर? या अन्य समस्याओं का कारण बनता है? इस मामले में उत्तर नहीं है, लेकिन फिर भी। – greggo

3

यह मान्य कोड है, लेकिन वास्तव में उस प्रारूप में अनुशंसित नहीं (कि कोड संभालने होगा कक्षा घोषणा का पालन करें)। चूंकि आप अंततः कक्षा का उपयोग करेंगे। यह मानते हुए कि आप अभी भी दो वर्गों का उपयोग करते हैं, यह बाद में भ्रमित हो सकता है। हो सकता है कि आपके पास बनाए गए वर्ग को वापस करने के लिए आपके पास फ़ंक्शन में लिपटे कोड होना चाहिए। अब आपके पास मूल factory है।

def HelloFactory(my_switch) 
    if my_switch: 
     class Hello: 
      def __init__(self): 
       self.greeting = "Hello!" 
    else: 
     class Hello: 
      def __init__(self): 
       self.greeting = "Salut!" 
    return Hello 

helloClass = HelloFactory(False) 
hello = helloClass() 
hello.greeting 

आउटपुट "सलात!"

+0

मुझे ओपी के मुकाबले यह स्निपेट और भी जटिल लगता है। मेरा मानना ​​है कि यदि संभव हो तो नेस्टेड कक्षाओं/कार्यों का उपयोग टालना चाहिए क्योंकि यह वास्तव में कोड पठनीयता को कम करता है। – MatToufoutu

+0

@MatToufoutu यह एक प्रतिस्थापन नहीं था, लेकिन एक साधारण उदाहरण है कि आप कारखाने के तरीके बना सकते हैं। मैं सहमत हूं कि कोड जोड़ने के लिए कोड जोड़ना कोड पठनीयता बनाएगा। – Rod

4

यह निश्चित रूप से स्थानीयकरण के लिए अनुशंसित नहीं है, जैसा कि आपके उदाहरण में है।

इस बात पर विचार करने की मुख्य बात यह है कि कक्षा के विशेष संस्करणों में कितना कोड समान बनाम होगा। यदि केवल थोड़ी सी मात्रा अलग है, या यदि केवल डेटा अलग है ("हैलो" बनाम "सलात"), तो बेहतर तरीके हैं।

एक मामला जहां मैं वर्गों की सशर्त घोषणा मान सकता हूं, यदि मैं दो अलग-अलग ओएस पर कार्यक्षमता प्रदान कर रहा हूं, और यह कार्यक्षमता दोनों के बीच बहुत अलग है। उदाहरण के तौर पर, शायद मैं एक स्क्रिप्ट से आईट्यून्स ड्राइव करने की कोशिश कर रहा हूं, और मैकोज़ पर मैं इसे चलाने के लिए ऐप्पलस्क्रिप्ट का उपयोग कर रहा हूं, लेकिन विंडोज़ पर मुझे COM का उपयोग करना होगा। मैं एक रैपर वर्ग बना सकता हूं कि मेरा शेष कोड इस बात की देखभाल किए बिना उपयोग कर सकता है कि किस ओएस का उपयोग किया जा रहा था।

+1

यहां तक ​​कि आपके ओएस मामले में भी मैं ऐसा नहीं करता। मेरे पास एक अभिभावक वर्ग होगा जो 'abc' है। बच्चे ओएस-विशिष्ट होंगे। माता-पिता का '__new__' उपयुक्त ओएस-विशिष्ट प्रकार का ऑब्जेक्ट वापस करेगा। – Daenyth

0

आपको कोड को दोहराने की आवश्यकता नहीं हो सकती है। खुद से पूछें कि क्या आपको कक्षा निर्माण कोड, या वर्ग के भीतर केवल चर को दोहराने की आवश्यकता है? यदि यह उत्तरार्द्ध है, तो आप __init__() में एक तर्क का उपयोग कर दोनों ही मामलों के लिए एक ही कक्षा इस्तेमाल कर सकते हैं, और फिर सशर्त वांछित चर के साथ वर्ग का एक उदाहरण देते हैं:

my_switch = False 

class Hello: 
    def __init__(self, greeting): 
     self.greeting = greeting 

if my_switch: 
    mygreeting = "Hello!" 
else: 
    mygreeting = "Salut!" 

hello = Hello(mygreeting) 
print hello.greeting 
# => Salut! 
4

तुम भी आसपास की स्थिति डाल सकते हैं " घोषणाओं "वर्ग के अंदर, उन के बाद से वर्ग निर्माण के हिस्से के रूप क्रियान्वित कर रहे हैं:

class Hello: 
    if my_switch: 
     igreeting = "Hello!" 
    else: 
     igreeting = "Salut!"  
    def __init__(self, greeting): 
      self.greeting = self.igreeting 

(एक सदस्य चर यहाँ एक वर्ग चर igreeting है, ग्रीटिंग)

या बस सामान्य

class Hello: 
    if my_switch: 
     greeting = "Hello!" 
    else: 
     greeting = "Salut!"  

... आमतौर पर वही प्रभाव देगा।

5

यदि आप इसे बेहतर पसंद करते हैं, तो आप प्रत्येक कक्षा परिभाषा को एक अलग .py फ़ाइल में डाल सकते हैं और केवल import जिसे आप चाहते हैं।निम्नलिखित की तरह कुछ:

if my_switch: 
    from hello_en import Hello 
else: 
    from hello_fr import Hello 

h = Hello() 
संबंधित मुद्दे