2011-02-01 9 views
6

यह कोड मेरे लिए कैसे चलाता है?मुझे नहीं पता कि __slots__ कैसे काम करें

class Foo(): 
    __slots__ = [] 
    def __init__(self): 
     self.should_not_work = "or does it?" 
     print "This code does not run,",self.should_not_work 

Foo() 

मैंने सोचा था कि स्लॉट्स एक प्रतिबंध के रूप में काम किया। मैं पाइथन 2.6.6 चला रहा हूँ।

उत्तर

8

__slots__ तंत्र नई शैली के वर्गों के लिए काम करता है। आपको object से उत्तराधिकारी होना चाहिए।

क्योंकि यह एक __dict__ उदाहरण के गुणों स्टोर करने के लिए आवंटित किया जा रहा रोका जा सकता है

class Foo(object): 
    # etc... 
+1

बढ़िया काम करता है! धन्यवाद! –

9

__slots__ स्मृति उपयोग का एक छोटा सा अनुकूलन प्रदान करता है करने के लिए वर्ग घोषणा बदलें। यह उपयोगी हो सकता है यदि आपके पास बहुत बड़ी संख्या है।

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

सभी पुरानी शैली के वर्ग स्वचालित रूप से __dict__ प्राप्त करते हैं, इसलिए __slots__ का कोई प्रभाव नहीं पड़ता है। यदि आप object से प्राप्त होते हैं तो आपको वह प्रभाव मिलेगा जो आप खोज रहे हैं, लेकिन मूल रूप से __slots__ से परेशान न हों जब तक आपको पता न हो कि आपके पास लाखों उदाहरण हैं और स्मृति एक समस्या है।

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