पायथन कक्षाओं में सार्वजनिक/निजी की कोई अवधारणा नहीं है, इसलिए हमें कुछ ऐसा स्पर्श नहीं करने के लिए कहा जाता है जो अंडरस्कोर से शुरू होता है जब तक कि हम इसे नहीं बनाते। लेकिन क्या हमें उन सभी वर्गों के पूर्ण ज्ञान की आवश्यकता नहीं है, जिनसे हम प्रत्यक्ष या परोक्ष रूप से उत्तराधिकारी हैं? गवाह:क्या पाइथन को विरासत श्रृंखला में सभी वर्गों के अंतरंग ज्ञान की आवश्यकता है?
class Base(object):
def __init__(self):
super(Base, self).__init__()
self._foo = 0
def foo(self):
return self._foo + 1
class Sub(Base):
def __init__(self):
super(Sub, self).__init__()
self._foo = None
Sub().foo()
उम्मीद के मुताबिक, एक TypeError
जब None + 1
मूल्यांकन किया जाता है उठाया है। तो मुझे पता होना चाहिए कि _foo
बेस क्लास में मौजूद है। इसके आस-पास पहुंचने के लिए, __foo
का उपयोग इसके बजाय किया जा सकता है, जो नाम को उलझाने में समस्या हल करता है। ऐसा लगता है, अगर सुरुचिपूर्ण नहीं है, तो एक स्वीकार्य समाधान। हालांकि, Base
किसी वर्ग (एक अलग पैकेज में) से Sub
नामक विरासत में क्या होता है? Sub
में __foo
दादा Sub
में __foo
ओवरराइड __foo
।
इसका तात्पर्य है कि मुझे प्रत्येक विरासत श्रृंखला को जानना होगा, जिसमें प्रत्येक "निजी" ऑब्जेक्ट्स शामिल हैं। तथ्य यह है कि पाइथन गतिशील रूप से टाइप किया गया है, यह भी कठिन बनाता है, क्योंकि खोज के लिए कोई घोषणा नहीं है। सबसे बुरा हिस्सा, हालांकि, शायद Base
object
से प्राप्त हो सकता है, लेकिन भविष्य में रिलीज में, यह Sub
से विरासत में बदल जाता है। स्पष्ट रूप से अगर मुझे पता है कि Sub
विरासत में मिला है, तो मैं अपनी कक्षा का नाम बदल सकता हूं, हालांकि यह परेशान है। लेकिन मैं भविष्य में नहीं देख सकता।
क्या यह ऐसा कोई मामला नहीं है जहां एक वास्तविक निजी डेटा प्रकार किसी समस्या को रोक देगा? कैसे, पायथन में, क्या मैं यह सुनिश्चित कर सकता हूं कि मैं किसी के पैर की उंगलियों पर गलती से कदम नहीं उठा रहा हूं यदि भविष्य में किसी भी बिंदु पर उन पैर की उंगलियों का अस्तित्व हो सकता है?
संपादित: मैं जाहिरा तौर पर स्पष्ट प्राथमिक सवाल नहीं किए हैं। मैं नाम मैंगलिंग और एक सिंगल और डबल अंडरस्कोर के बीच का अंतर से परिचित हूं। सवाल यह है कि मैं इस तथ्य से कैसे निपट सकता हूं कि मैं कक्षाओं के साथ संघर्ष कर सकता हूं जिसका अस्तित्व मुझे अभी के बारे में नहीं पता है? अगर मेरे माता-पिता वर्ग (जो पैकेज में मैंने लिखा नहीं है) एक वर्ग से विरासत शुरू करने के लिए होता है, जो मेरी कक्षा के समान नाम से होता है, यहां तक कि नाम मैंगलिंग भी मदद नहीं करेगा। क्या मैं इसे (कोने) मामले के रूप में देखने में गलत हूं कि सच्चे निजी सदस्य हल करेंगे, लेकिन पाइथन को परेशानी है?
संपादित:
फ़ाइल parent.py
:
class Sub(object):
def __init__(self):
self.__foo = 12
def foo(self):
return self.__foo + 1
class Base(Sub):
pass
फ़ाइल sub.py
: अनुरोध अनुसार, निम्नलिखित एक पूर्ण उदाहरण है
import parent
class Sub(parent.Base):
def __init__(self):
super(Sub, self).__init__()
self.__foo = None
Sub().foo()
दादा-दादी के foo
कहा जाता है, लेकिन मेरे __foo
का उपयोग किया जाता है।
जाहिर है आप इस तरह अपने आप को कोड लिखने नहीं होगा, लेकिन parent
आसानी से तीसरे पक्ष द्वारा प्रदान किया जा सकता है, जो के विवरण किसी भी समय बदल सकता है।
आपको एक उदाहरण पोस्ट इस जहां अन्य एक ही नामित वर्ग does not को पूरी तरह से अपने मौजूदा कक्षा शैडो प्रदर्शित करने के लिए कर सकते हैं? .. या शायद मैं अभी भी understanding..nevermind नहीं ... मैं एक बना दिया है और अपने अधिकार मैं लगता है कि यह एक कोने है मामला ... बस सामान्य निजी var/वर्ग नामों का उपयोग न करने का प्रयास करें, मुझे लगता है कि –