2011-05-10 22 views
11

के बीच __dict__ में पाइथन अंतर में मैं गतिशील विशेषताओं के साथ गड़बड़ कर रहा था और मैंने देखा कि अगर मैं ऑब्जेक्ट() कक्षा से सीधे ऑब्जेक्ट बनाता हूं तो मैं __dict__ विशेषता का उपयोग नहीं कर सकता लेकिन अगर मैं एक नई कक्षा बनाएं जो ऑब्जेक्ट का प्रत्यक्ष वंशज है I __dict__ विशेषता का उपयोग कर सकता हूं। अंतर क्यों?ऑब्जेक्ट() और क्लास myClass (ऑब्जेक्ट)

उदाहरण:

# This gives an AttributeError 
o = object() 
o.__dict__ 
# This works: prints {} 
class myClass(object): 
    pass 
o = myClass() 
o.__dict__ 
+0

'__dict__' के साथ फिडलिंग सीधे हमेशा अनियंत्रित और बुरा विचार है। गतिशील विशेषताओं का नाम आम तौर पर शब्दकोश कुंजी के रूप में बेहतर होता है, लेकिन कुछ मामलों में उचित होता है - लेकिन आप उन मामलों में केवल 'setattr' का उपयोग कर सकते हैं। – delnan

उत्तर

8

object सी में कार्यान्वित किया जाता है और एक __dict__ विशेषता नहीं है। (सभी पायथन वस्तुओं में यह नहीं है; __slots__ देखें)।

+0

@ जैमी नोट करें कि आप 'ऑब्जेक्ट()' करके प्राप्त किए गए किसी उदाहरण पर यादृच्छिक विशेषताओं को असाइन नहीं कर सकते हैं, या तो, जबकि आप 'myClass' के उदाहरण के साथ कर सकते हैं। वास्तव में 'ऑब्जेक्ट' के उदाहरण के साथ आप बहुत कुछ नहीं कर सकते हैं जो कि किसी भी अन्य वर्ग का उदाहरण नहीं है। – Ben

1

मुझे पूरी तरह से यकीन नहीं है कि यह आपकी कक्षा के लिए क्यों काम करता है लेकिन मूल object कक्षा नहीं। मुझे लगता है कि जब आपकी कक्षा शुरू हो जाती है, तो यह __dict__ बनाता है।

इस कोड का उपयोग करना:

class Test(object): 
    def __init__(self): 
     pass 

def main(): 
    print 'OBJECT:', dir(object()) 
    print 
    print 'TEST:', dir(Test()) 
    return 

इस उत्पादन के साथ आया:

OBJECT: ['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__'] 

TEST: ['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__'] 

आप देख सकते हैं, __dict__, __module__, और टेस्ट वस्तु में __weakref__ हैं, लेकिन नहीं आधार वस्तु

+2

यह पायथन का एक निहित हिस्सा है - यह वर्ग परिभाषा तक है कि वे __dict__ विशेषता प्रदान करना चाहते हैं या नहीं (इसे छोड़कर प्रति उदाहरण स्थान के एक उचित बिट को बचा सकता है)। चूंकि __dict__ को डिफ़ॉल्ट रूप से उदाहरणों में शामिल किया गया है, इसलिए आपको विशेष रूप से कक्षा परिभाषा समय पर कार्रवाई करने से बचने के लिए कार्रवाई करना होगा। – ncoghlan

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