मेरे पास सैकड़ों हजारों नोड्स के साथ एक बड़ा पेड़ है, और मैं स्मृति खपत को कम करने के लिए __slots__
का उपयोग कर रहा हूं। मुझे बस एक बहुत ही अजीब बग मिली और इसे ठीक कर दिया, लेकिन मैंने जो व्यवहार देखा वह मुझे समझ में नहीं आया।पायथन, __slots__, विरासत, और वर्ग चर ==> विशेषता केवल पढ़ने के लिए बग
>>> node = NodeTypeA("Monty")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in __init__
AttributeError: 'NodeTypeA' object attribute 'name' is read-only
कोई त्रुटि है, तो NodeTypeA.name
परिभाषित नहीं है (ओर टिप्पणी नहीं है:
class NodeBase(object):
__slots__ = ["name"]
def __init__(self, name):
self.name = name
class NodeTypeA(NodeBase):
name = "Brian"
__slots__ = ["foo"]
मैं तो निम्नलिखित निष्पादित करें:
यहाँ एक सरलीकृत कोड नमूना है कि विशेषता वहां गलती से किया गया था, और वहां होने का कोई कारण नहीं था)। वहाँ भी कोई त्रुटि है, तो NodeTypeA.__slots__
परिभाषित नहीं किया जाता है, और यह इसलिए एक __dict__
है।
बात मुझे समझ नहीं आता है: क्यों एक सुपर क्लास में एक वर्ग चर के अस्तित्व बच्चे कक्षा में एक स्लॉट में एक उदाहरण चर की स्थापना के साथ हस्तक्षेप करता है?
किसी को क्यों इस संयोजन object attribute is read-only
त्रुटि में परिणाम व्याख्या कर सकते हैं? मुझे पता है कि मेरा उदाहरण बढ़ गया है, और वास्तविक कार्यक्रम में जानबूझकर होने की संभावना नहीं है, लेकिन यह इस व्यवहार को कम अजीब नहीं बनाता है।
धन्यवाद,
जोनाथन
'NodeTypeA' एक वर्ग चर' name' पैदा कर रही है और उदाहरण चर 'NodeBase' में परिभाषित करने के लिए एक मूल्य बताए नहीं। क्या यह जानबूझकर है? – unholysampler
यह पहली बार जानबूझकर नहीं था - मुझे गलती से यह मेरे कोड में था, जिसके कारण मैं बग पूछ रहा था। लेकिन फिर मुझे उत्सुकता है कि कोड ऐसा क्यों व्यवहार करता है, इसलिए मैं जानबूझकर इसे अपने कोड नमूने में डालता हूं। – Jonathan