2013-05-16 8 views
5

में कक्षा के कुछ फ़ंक्शन को परिभाषित करने का क्या फायदा है Python में कक्षा के बाहर फ़ंक्शंस को क्यों घोषित किया जाना चाहिए?पायथन प्रोग्राम

उदाहरण के लिए, following project on Github अपने _hash, _task_from_taskline, और _tasklines_from_tasks कार्यों के साथ करता है। प्रारूप में निम्न रूप में ही है:

class UnknownPrefix(Exception): 
"""Raised when trying to use a prefix that does not match any tasks.""" 
def __init__(self, prefix): 
    super(UnknownPrefix, self).__init__() 
    self.prefix = prefix 


def _hash(text): 

    return hashlib.sha1(text).hexdigest() 

def _task_from_taskline(taskline): 
    """ 
    snipped out actual code 
    """ 
    return task 

def _tasklines_from_tasks(tasks): 
    """Parse a list of tasks into tasklines suitable for writing.""" 


    return tasklines 

लेकिन मुझे लगता है इन कार्यों वर्ग TaskDict के साथ एक रिश्ता नहीं है।

उन्हें कक्षा से बाहर क्यों रखा गया? उन्हें कक्षा के बाहर घोषित करने का क्या फायदा है?

+1

बारी उसके चारों ओर है: क्या लाभ कक्षा में उन्हें बजाय डाल करने के लिए हो सकता है? –

+0

@MartijnPieters Encapsulation। –

+0

@ जॉर्जस्टॉकर: क्या होगा अगर फ़ंक्शन का उदाहरण स्थिति पर कोई असर न हो? –

उत्तर

3

Stop Writing Classes PyCon बात बिल्कुल इस विषय पर नहीं है, लेकिन शामिल महसूस क्या मैं यहाँ से संबंधित हैं सबक: मूल रूप से, विचार यह है कि वर्गों वस्तुओं बनाने के लिए कर रहे हैं। सभी विशेषताओं, उदाहरण विधियों और वर्ग विधियों को वस्तुओं को बनाने या ऑब्जेक्ट्स को काम करने का लक्ष्य आगे बढ़ाना चाहिए। कक्षाएं कोड संगठन (इस सिद्धांत के तहत) के लिए नहीं हैं - यही मॉड्यूल के लिए है।

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

तो क्यों उन्हें कक्षा में क्यों नहीं रखा गया? यह इस बात पर उबलता है कि आप मानते हैं कि वर्गों को कोड संगठन के लिए इस्तेमाल किया जाना चाहिए या नहीं। इस मामले में, लेखक ने स्पष्ट रूप से इस विचार में खरीदा कि यह मॉड्यूल है जो कोड संगठन के लिए हैं, वर्ग नहीं।

0

आम तौर पर, यह तय करते समय कि कार्य कहां रखना है, यह जानना महत्वपूर्ण है कि कार्यों का उपयोग करने के लिए क्या किया जा रहा है। यदि वे कक्षा में आंतरिक हैं और आपके कार्यक्रम के अन्य हिस्सों द्वारा उपयोग नहीं किया जाता है तो उन्हें कक्षा में रखना समझ में आता है। लेकिन यदि अन्य हिस्सों में अधिकतर उनका उपयोग किया जाएगा, तो वे मॉड्यूल स्तर पर होना चाहिए।

+0

हां, मैंने सोचा है कि, मुझे लगता है कि कार्य वर्ग से संबंधित है, और इसका इस्तेमाल वर्ग के बाहर दूसरों को नहीं किया जाएगा। तो मुझे संदेह है कि कक्षा – poleworld

1

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

कक्षा के बाहर उन्हें रखने का एकमात्र लाभ यह है कि यदि आपके पास अन्य कोड है जो इन कार्यों का उपयोग करेगा जो कक्षा से संबंधित नहीं हैं। या यदि आप कुछ सहायक कार्यों का निर्माण कर रहे हैं जिनका उपयोग अन्य मॉड्यूल द्वारा किया जाएगा।

3
  1. वे आयात करने के लिए आसान कर रहे हैं और सदस्य कार्यों
  2. यहां तक ​​कि अगर आप उन्हें कक्षा में डाल की तुलना में कम नाम है, वे शायद एक classmethod/वैसे भी staticmethod होने के लिए जा रहे हैं।
  3. पायथनिक कोड डक-टाइपिंग का उपयोग करता है; एक विधि का अर्थ यह होगा कि इसका उपयोग केवल उस वर्ग के साथ किया जा सकता है, जबकि वास्तव में कोड उससे अधिक सामान्य हो सकता है।
  4. व्यक्तिगत वरीयता। कुछ लोगों को "डोमेन मॉडल" और "व्यापार तर्क" के बीच अलग होना पसंद आया।

अंत में, इस विशेष कार्यक्रम के लिए, वास्तव में कोई लाभ नहीं है और न ही किसी भी तरीके से नुकसान होता है।

+0

कक्षा से बाहर क्यों परिभाषित करें हां, मेरे लिए। मैं उन्हें कक्षा में रखूंगा और staticmethod के रूप में परिभाषित करूंगा। – poleworld

1

कार्यों छोटे प्रदर्शन लाभ

>>> import timeit 
>>> timeit.Timer('foo()', 'def foo(): return 1').timeit() 
0.09944701194763184 
>>> timeit.Timer('A.foo()', ''' 
... class A(object): 
...  @staticmethod 
...  def foo(): 
...   return 1''').timeit() 
0.12048101425170898 
संबंधित मुद्दे