पायथन क्लास में तरीकों को ऑर्डर करने का एक अच्छा तरीका क्या है?


86

मैं पायथन वर्ग में विधियां देना चाहता हूं लेकिन मुझे नहीं पता कि सही क्रम क्या है।

जब मैं ग्रहण में विधियों को PyDev के साथ निकालता हूं, तो ग्रहण संशोधित विधि के शीर्ष पर निकाली गई विधि डालता है। लेकिन यह निचले स्तर के विवरण को उच्च स्तर के विवरण से पहले रखता है। अंकल बॉब के अनुसार मुझे इसके विपरीत करना चाहिए ताकि मेरा कोड एक अखबार की सुर्खियों की तरह पढ़े। जब मैं जावा प्रोग्राम करता हूं तो मैं सिर्फ उनकी सलाह का पालन करता हूं।

पायथन के लिए सबसे अच्छा अभ्यास क्या है?


8
सबसे अच्छा अभ्यास नहीं है। क्या करें जो सबसे अधिक समझ में आता है - शीर्ष के पास महत्वपूर्ण सामान एक अच्छा विचार है, और स्थिरता आमतौर पर एक अच्छी बात है। PEP-8 इसका उल्लेख नहीं करता है, और अगर इसे पत्थर में सेट किया जाना था, तो यह वह जगह होगी जहां यह होगा।
— गैरेथ लेटी

4
और यहां तक ​​कि PEP8 हमेशा पत्थर में सेट नहीं होता है।
— इग्नासियो वाज़क्वेज़-अब्राम्स

1
मैं इसे आमतौर पर कार्यक्षमता (समूह, सेट, आदि) पर समूह द्वारा करता हूं
— CppLearner

यह ध्यान रखना महत्वपूर्ण है कि विधि कार्यों का क्रम मनमाना हो सकता है, क्योंकि एक वर्ग घोषणा केवल अपने विधि कार्यों को परिभाषित कर रही है, उन्हें लागू नहीं कर रही है। यह क्लास मेथड रुटीन के सोर्स कोड को ऐसे मेथड फंक्शंस का सफलतापूर्वक उपयोग करने की अनुमति देता है जिन्हें बाद में लिस्टिंग में परिभाषित किया जाएगा।
— ड्रैगनलॉर्ड

जवाबों:


64

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

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

  • गुण, जादू के तरीके , सार्वजनिक तरीके: उन तीनों के बीच सबसे अच्छे क्रम को परिभाषित करना कठिन है, जो सभी वर्ग के इंटरफ़ेस का हिस्सा हैं। जैसा कि @ ईथनफुर्मन कहते हैं, पूरे प्रोजेक्ट के लिए एक सिस्टम के साथ रहना सबसे महत्वपूर्ण है। आम तौर पर, लोग __init__()कक्षा में सबसे पहले पहले समारोह की उम्मीद करते हैं, इसलिए मैं नीचे दिए गए अन्य जादुई तरीकों का पालन करता हूं।

  • रीडिंग ऑर्डर: मूल रूप से, कहानी कहने के दो तरीके हैं: बॉटम-अप या टॉप-डाउन। उच्च-स्तरीय कार्यों को पहले रखकर, एक डेवलपर पहले दो पंक्तियों को पढ़कर कक्षा की एक अच्छी समझ प्राप्त कर सकता है। अन्यथा, किसी भी वर्ग को समझने के लिए पूरी कक्षा को पढ़ना होगा और अधिकांश डेवलपर्स के पास इसके लिए समय नहीं है। अंगूठे के एक नियम के रूप में, उनके शरीर से कहे जाने वाले सभी तरीकों के ऊपर तरीके रखें।

  • क्लास के तरीके और स्टैटिक तरीके: आमतौर पर, यह ऊपर वर्णित रीडिंग ऑर्डर द्वारा निहित है । सामान्य तरीके सभी तरीकों को कॉल कर सकते हैं और इस प्रकार पहले आते हैं। क्लास मेथड केवल क्लास मेथड और स्टैटिक मेथड को कॉल कर सकते हैं और आगे आ सकते हैं। स्टेटिक तरीके कक्षा के अन्य तरीकों को कॉल नहीं कर सकते हैं और अंतिम आ सकते हैं।

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


1
आमतौर पर एक भाषा आदेश देने को लागू नहीं करती है। लेकिन कुछ भाषाओं में आम परंपराएं हैं। Eg C # StyleCop में सख्त ऑर्डर देने के नियम हैं। जावा के लिए stackoverflow.com/questions/4668218 , आदि देखें
— xmedeko

1
क्लास के तरीके: इन्हें अक्सर कंस्ट्रक्टर के रूप में उपयोग किया जाता है और फिर वे आम तौर पर __init__स्पष्ट रूप से (साथ संयोजन में __new__) या अंतर्निहित रूप से (डिफ़ॉल्ट कंस्ट्रक्टर के माध्यम से) कॉल करते हैं , इसलिए यह उन्हें एक साथ रखने का एक कारण होगा __init__। (हालांकि मैं कभी नहीं देखा है उन्हें रखा से पहले __init__ ।)
— oulenz

13

कोई भी सही क्रम नहीं है। एक प्रणाली चुनें और इसके साथ रहें। जिसका मैं उपयोग कर रहा हूं:

class SomeClass(object):
    def __magic_methods__(self):
        "magic methods first, usually in alphabetical order"
    def _private_method(self):
        "worker methods next, also in alpha order"
    def a_method(self):
        "then normal methods, also in alpha order"

2
Staticmethods, वर्ग चर और @property सजाया तरीकों के लिए आपकी प्राथमिकता क्या है?
— जॉन मी

@ जॉनमनी: वर्ग चर जो मैंने किसी और चीज से पहले रखा था; मेरी तह विधि खाल @staticmethod, @classmethod, @property, और किसी भी अन्य @decoratorलाइनों तो मैं निर्धारित करने के लिए जहां यह (अपवाद है कि गुणों के बीच जाने के लिए करते हैं के साथ चला जाता विधि के प्रकार का उपयोग _private_methodsऔर normal_methods)।
— एथन फुरमैन

इसलिए यदि आदेश मूल रूप से बहुत ही निजी "जादू" तरीकों से निजी से सामान्य तरीकों तक जाता है, तो क्या इसका मतलब है कि @classmethodअगला ( @classmethod def a_class_method(cls)) फिर @staticmethodएस ( @staticmethod def a_static_method()) है? कम से कम यह नीति है कि मैं इसे समझता हूं ... (मेरी आईडीई के बिना कुछ भी तह करना क्योंकि मुझे वह पसंद नहीं है)
— काऊ

2

मैं @ ईथन के साथ कुछ ऐसा ही करता हूं जो मैंने Django के स्रोत में देखा था, जहां मुख्य अंतर बड़ा है "############" क्षेत्रों को परिसीमन करने के लिए टिप्पणी करें। उदाहरण के लिए,

class SomeClass(object):
    #################
    # Magic Methods #
    #################
    def __magic_methods__(self):
        "magic methods first"

    ##################
    # Public Methods #
    ##################
    def a_method(self):
        "then normal methods, in order of importance"

    ###################
    # Private Methods #
    ###################
    def _private_method(self):
        "then worker methods, grouped by importance or related function"

जाहिर है कि यह छोटी कक्षाओं के लिए कम उपयोगी है।


19
लेकिन मैं देख सकता हूँ कि वे जादू, सार्वजनिक या निजी हैं। मैं सक्रिय रूप से टिप्पणियों के ऐसे ब्लॉकों को नापसंद करता हूं, खुद को; अगर मैं उन सभी की सूची देखना चाहता हूं, तो मैं मुड़ा हुआ कोड देख सकता हूं। कार्यक्षमता-संबंधित विधियों के एक विशेष ब्लॉक के ऊपर एक टिप्पणी करने से कुछ ऐसा होता है जो मैं करता हूं, लेकिन इस प्रकार की टिप्पणी के लिए - यही विधि के नाम मुझे बताते हैं।
— क्रिस मॉर्गन

फिर, मैं केवल बड़ी कक्षाओं के लिए ऐसा करता हूं। मुझे लगता है कि अर्ध-निजी ( ) और नाम-मैंगल्ड (_ ) विधियों के साथ जादू के तरीकों को भ्रमित करना आसान है ।
— मैट लुओंगो

####जब मैं महसूस करता था कि आप उन्हें उद्देश्य से वहाँ डालेंगे, तो मुझे बदसूरत ब्लॉक हटाकर मध्य-संपादित कर दिया गया था मैं इस आदेश से सहमत हूं , हालांकि, यह सवाल क्या है। मैं ####इस उदाहरण से हटाने की सलाह दूंगा क्योंकि यह प्रश्न के दायरे से संबंधित नहीं है और आपका उदाहरण एक छोटे वर्ग का है, जिसके लिए आप किसी ####भी रास्ते का उपयोग नहीं करेंगे । :-)
— मतीन उल्हाक

1
@MateenUlhaq कृपया संपादन स्क्रीन पर प्रदर्शित दूसरे और पांचवें दिशा-निर्देशों का संदर्भ लें: "इसे बदले बिना अर्थ स्पष्ट करें" और " हमेशा मूल लेखक का सम्मान करें"। (ध्यान दें कि इन्हें बिना शर्त के लागू किया जाना चाहिए, संपादक की अपनी राय का कोई सम्मान नहीं।) इस उत्तर का पूरा और एकमात्र बिंदु उन बदसूरत टिप्पणी ब्लॉक को प्रदर्शित करना था; उनके बिना, यह ठीक वैसी ही बात कहता है जैसे एतान का उत्तर और यहाँ होने का कोई मतलब नहीं है। आपने यह भी स्वीकार किया कि ब्लॉक " उद्देश्य पर " थे - यह जानकर, आप उन्हें क्यों हटाएंगे?
— आधा

1
@ सीधे तौर पर मैंने इसे प्रश्न के दायरे से बाहर माना है। जैसा कि आप देख सकते हैं, Rev2 में अभी भी ऐसी सामग्री है जो कि अलग-अलग ऑर्डरिंग (और सबऑर्डिंग!) के साथ ईथन के प्रश्न का अलग-अलग उत्तर देती है। फिर भी, लुढ़क गया।
— मतीन उल्हाक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.