2013-10-27 4 views
16

मेरे पास एक फ़ाइल है जिसका उपयोग एक उपयोगिता फ़ाइल होना है। फ़ाइल में स्थिर विधियों के बहुत सारे होना चाहिए।एक उपयोगिता वर्ग को सही तरीके से कैसे बनाएं

मैं इस तरह से एक वर्ग के अंदर पद्धतियां निर्धारित करना चाहिए:

#utility.py 
class utility(object): 
    @staticmethods 
    def method1(a,b,c): 
     pass 

    @staticmethods 
    def method2(a,b,c): 
     pass 

या (एक वर्ग) के बिना इस तरह इसका इस्तेमाल:

#utility.py 
def method1(a,b,c): 
    pass 

def method2(a,b,c): 
    pass 
+6

कार्य बेहतर कार्यों के रूप में परिभाषित कर रहे हैं। यदि आपको कक्षा की आवश्यकता नहीं है, तो एक मत बनाओ। –

+0

वह उत्तर था जो मैं ढूंढ रहा था: पी – Nirock

+2

@PaulGriffiths बिल्कुल। @Nirock एक मजबूत संकेतक कि एक विधि वास्तव में एक समारोह हो सकता है/चाहिए जब यह अपने 'स्वयं' तर्क का उपयोग नहीं करता है। ['Pylint'] जैसे उपकरण (http://www.pylint.org/) यहां तक ​​कि इसके लिए भी जांच करें और आपको एक संकेत दें। –

उत्तर

19

दूसरा विकल्प अजगर में काम करने का ढंग है। मेरा मतलब है, अगर सभी आप कर रहे हैं कार्यों का आयात है, तो आप कुछ इस तरह कर सकते हैं:

from utility import some_func 

जो अपने कार्य आयात करेगा।

सर्वोत्तम अभ्यास यह है कि यदि आप केवल स्थिर कार्य का उपयोग कर रहे हैं, तो बस उन्हें एक अलग मॉड्यूल के वैश्विक नामस्थान में रखें, इससे आपका जीवन बहुत आसान हो जाएगा। आप जो करने की कोशिश कर रहे हैं वह वस्तुओं को बना रहा है और उन्हें स्थिर तरीकों से भरें। ऐसा क्यों करें, जब आप केवल .py फ़ाइल में फ़ंक्शंस को परिभाषित कर सकते हैं?

वास्तव में, आप करने की कोशिश कर रहे हैं किया गया है। आप कुछ अच्छे उपयोगिता कार्यों को दूर करने की कोशिश कर रहे हैं। खैर, python-requests, एक तीसरी पार्टी लाइब्रेरी है जिसे अधिकांश पाइथोनिस्टस द्वारा पसंद किया जाता है, यह सिर्फ यह करता है। यह एक अलग मॉड्यूल में अपने अच्छे उपयोगिता कार्यों को दूर करता है। Here is the example.

+0

यह उपयोगिता। Method1 (...) तरीके का उपयोग करने के लिए मुझे अधिक आराम लगता है। क्या मुझे खुद को इस तरह से करने के लिए मजबूर होना चाहिए? मैं वास्तव में सबसे अच्छा अभ्यास का उपयोग करना चाहता हूँ। – Nirock

+0

** कभी भी उत्पादन कोड में 'foo आयात * से 'का उपयोग न करें। यह ट्रैक करना असंभव बनाता है कि आयात कहां से आया था, और अंतर्निहित नामों को ढंक सकता है। –

+2

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

7

हालांकि यह प्रश्न थोड़ा सा राय आधारित है, तो मैं कहूंगा कि दूसरा बेहतर है। यह अनावश्यकता को कम करता है। का उपयोग करते हुए एक दूसरे लेकिन अनुमति देता है तो आप बस करने के लिए

from utility import utility 
utility.method1(...) 

:

import utility 
utility.method1(...) 

या:

पहली विधि का उपयोग करना, आप क्या करना होगा:

import utility 
utility.utility.method1(...) 

या

from utility import method1 
method1(...) 

यदि आप एक कक्षा बना रहे हैं ly में स्थिर तरीके हैं, मेरा सवाल है "आपको कक्षा की आवश्यकता क्यों है?" यह यहां कुछ भी सकारात्मक योगदान नहीं देता है।

9

कक्षाएं तो सामान्य नियम के रूप में, दोनों डेटा, और व्यवहार को संपुटित:

  • आप केवल डेटा के साथ कुछ है, तो और कोई तरीकों, यह शायद एक namedtuple, नहीं एक class होना चाहिए, जब तक कि आप की जरूरत है इसे बनाने के बाद उस डेटा को संशोधित करें।
  • यदि कोई फ़ंक्शन उदाहरण डेटा एक्सेस करता है, तो यह एक विधि होनी चाहिए।
  • यदि कोई फ़ंक्शन कोई आवृत्ति डेटा एक्सेस नहीं करता है, लेकिन क्लास डेटा एक्सेस करता है, तो यह @classmethod होना चाहिए।
  • यदि कोई फ़ंक्शन न तो इंस्टेंस डेटा और न ही क्लास डेटा तक पहुंचता है, तो यह एक स्टैंडअलोन फ़ंक्शन होना चाहिए, जब तक कि इसे @staticmethod बनाने के लिए कुछ वास्तव में अनिवार्य कारण न हो।
  • एक class केवल एक ही विधि, या __init__() के अलावा एक विधि है, तो आप लगभग निश्चित रूप से और एक समारोह के रूप में यह फिर से लिखने चाहिए सकता है।

कक्षाओं का दुरुपयोग करना वास्तव में आसान है, लेकिन कक्षा में सबकुछ फेंकने का मोह वास्तव में टालना चाहिए। जब वे समझ में आते हैं, तो उन्हें उनका उपयोग करना चाहिए, और जब वे नहीं करते हैं तो उनका उपयोग करने से बचें।

+0

अच्छा व्यापक जवाब किया गया है के रूप में अजगर-अनुरोध शामिल किए। –

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