पायथन कक्षाएं केवल एक उदाहरण के साथ: कब (एकल) वर्ग की आवृत्ति बनाएं और इसके बजाय कक्षा के साथ कब काम करें?


11

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

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

  1. यह वैश्विक चर और कार्यों को एक वर्ग में वर्गीकृत करने के बारे में है और
  2. यह अजगर-विशिष्ट नहीं है। उत्तरार्द्ध का अर्थ है कि यह इस तथ्य पर विचार नहीं करता है कि (पायथन में) कक्षाएं ऑब्जेक्ट भी हैं।

अपडेट करें:

अजगर में, मैं दोनों वर्गों और वस्तुओं के साथ निम्नलिखित कर सकता हूं:

class A(object):
    pass

A.some_state_var = True
# Then later
A.some_state_var = False


my_a = A()

my_a.some_state_var = True
# Then later
my_a.some_state_var = False

इसलिए मैं यह नहीं देखता कि एक वर्ग और उस वर्ग के उदाहरण के बीच चुनाव राज्य (पायथन) में कैसे होता है। मैं दोनों में से किसी एक राज्य को बनाए रख सकता हूं।

इसके अलावा, मेरी कक्षा / कक्षा का उदाहरण बनाने की प्रेरणा एक सिंगलटन आवश्यकता को लागू करने के बारे में नहीं है।

इसके अलावा, यह एक नया प्रकार बनाने के बारे में इतना नहीं है।

प्रेरणा संबंधित कोड और डेटा समूह है और इसके लिए एक इंटरफ़ेस है। यही कारण है कि मैंने शुरू में इसे क्लास आरेख में एक वर्ग के रूप में मॉडलिंग की। केवल जब यह कार्यान्वयन की बात आई तो मैं यह सोचने लगा कि क्या इस वर्ग को त्वरित करना है या नहीं।

जवाबों:


16

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

तो यह है:

class Singleton:
    '''don't bother instantiating me'''
    clsvar1 = 'foo'

    @classmethod
    def foobar(cls, *args, **kwargs):
        if condition():
            cls.clsvar1 = 'bar'

इस बनाम?

class Singleton:
    '''instantiate and use me'''
    def __init__(self):
        self.var1 = 'foo'

    def foobar(self, *args, **kwargs):
        if condition():
            self.var1 = 'bar'

सिफ़ारिश करना

मैं निश्चित रूप से उस व्यक्ति को तरजीह दूंगा जिसका उद्देश्य त्वरित होना है। जब आप एक "प्रकार की चीज" बनाते हैं जिसका अर्थ है कि आप उस प्रकार की चीजें बनाते हैं।

प्रेरणा संबंधित कोड और डेटा समूह है और इसके लिए एक इंटरफ़ेस है।

उस ने कहा, क्यों न केवल एक मॉड्यूल का उपयोग करें क्योंकि आप चाहते हैं कि एक नाम स्थान है? मॉड्यूल एकल, समूह से संबंधित कोड और डेटा हैं, और यह थोड़ा सरल है और शायद इसे अधिक पायथोनिक माना जाएगा:

var1 ='foo'

def foobar(*args, **kwargs):
    global var1
    if condition():
        var1 = 'bar'

इसलिए उपयोग इसके बजाय होगा:

from modules.singleton import Singleton
Singleton.foobar()

या

from modules.singleton import Singleton
the_singleton = Singleton()
the_singleton.foobar()

यह करो:

from modules import singleton
singleton.foobar()

3
आपके उत्तर के लिए धन्यवाद। क्या आप वास्तव में हर फ़ंक्शन (incl। चर) के लिए एक नया मॉड्यूल (एक नई .py फ़ाइल) बनाने का सुझाव देंगे? यह कई छोटी .py फ़ाइलों का परिणाम हो सकता है। या क्या आप सभी (कम से कम किसी तरह से संबंधित) "क्लास-लेस" फ़ंक्शन और चर एक मॉड्यूल में करेंगे?
langlauf.io

एक और टिप्पणी: आप लिखते हैं "चूंकि आप चाहते हैं कि एक नाम स्थान है"। मैं जो चाहता हूं, वह संबंधित कोड, फ़ंक्शंस और डेटा, एक ही स्थान पर है, और इसका एक इंटरफ़ेस है। यह "टाइप" बनाने के बारे में इतना नहीं है। डिजाइन के दौरान, यह एक वर्ग आरेख में किसी भी वर्ग में परिणाम होगा, है ना?
langlauf.io

2

मैं सोच रहा था कि किन मामलों में यह वर्ग के साथ सीधे काम करने के बजाय एकल वर्ग उदाहरण बनाने के लिए समझ में आता है।

यह उन चीज़ों में से एक है जो अगर आप बहुत कुछ कर लेते हैं तो धार्मिक युद्ध का कारण बनेंगे।

लेकिन आम तौर पर एक प्रथा जो मैंने कई बार देखी है वह यह है कि कक्षा के तरीकों को केवल उस वर्ग के उदाहरण बनाने के साथ ही चिंता करनी चाहिए।

यदि आप सोचते हैं कि एक वर्ग क्या है, उसका उद्देश्य / व्यवहार क्या है, तो यह समझ में आता है। एक वर्ग का उद्देश्य वस्तुओं का उदाहरण बनाना है जो स्वयं पर आधारित हैं । यह एक खाका है जो इमारत भी बना सकता है। एक "उपयोगकर्ता" वर्ग "उपयोगकर्ता" ऑब्जेक्ट बनाता है। एक "डॉग" वर्ग "डॉग" ऑब्जेक्ट्स आदि बनाता है

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

तो भले ही आप केवल एक "x" ऑब्जेक्ट की आवश्यकता के लिए जा रहे हों, फिर भी आपको इसे अलग करना चाहिए।

एक्स वर्ग के तरीकों को जोड़ना जो "x" ऑब्जेक्ट्स के इंस्टेंस बनाने से संबंधित नहीं हैं, अप्रत्याशित कोड को भ्रमित कर सकते हैं। वास्तविक दुनिया में बेशक ऐसे उदाहरण हैं जहां लोगों ने ऐसा किया है, लेकिन जैसा मैंने कहा कि रास्ता धार्मिक युद्ध की ओर ले जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.