क्या अजगर में कक्षा के निर्माता __init__
को बाधित करने का कोई तरीका है?क्या __init__ को कॉल किए बिना कक्षा को तुरंत चालू करने का कोई तरीका है?
उदाहरण:
class A(object):
def __init__(self):
print "FAILURE"
def Print(self):
print "YEHAA"
अब मैं A
का एक उदाहरण बनाने के लिए करना चाहते हैं। यह ऐसा दिखाई दे सकता है, हालांकि यह वाक्यविन्यास सही नहीं है।
a = A
a.Print()
संपादित करें:
एक और भी जटिल उदाहरण:
मान लीजिए मैं एक वस्तु C
, जो उद्देश्य यह एक एकल पैरामीटर की दुकान है और इसके साथ कुछ संगणना करने के लिए है। पैरामीटर, हालांकि, इस तरह से पारित नहीं किया गया है, लेकिन यह एक विशाल पैरामीटर फ़ाइल में एम्बेडेड है। यह कुछ इस तरह दिखाई दे सकता है:
class C(object):
def __init__(self, ParameterFile):
self._Parameter = self._ExtractParamterFile(ParameterFile)
def _ExtractParamterFile(self, ParameterFile):
#does some complex magic to extract the right parameter
return the_extracted_parameter
अब मैं डंप और उस वस्तु C
का एक उदाहरण लोड करने के लिए करना चाहते हैं। हालांकि, जब मैं इस ऑब्जेक्ट को लोड करता हूं, तो मेरे पास केवल एक परिवर्तनीय self._Parameter
है और मैं कन्स्ट्रक्टर को कॉल नहीं कर सकता, क्योंकि यह पैरामीटर फ़ाइल की अपेक्षा कर रहा है।
@staticmethod
def Load(file):
f = open(file, "rb")
oldObject = pickle.load(f)
f.close()
#somehow create newObject without calling __init__
newObject._Parameter = oldObject._Parameter
return newObject
दूसरे शब्दों में, पैरामीटर फ़ाइल को पास किए बिना एक उदाहरण बनाना संभव नहीं है। मेरे "असली" मामले में, हालांकि, यह पैरामीटर फ़ाइल नहीं है लेकिन डेटा का कुछ बड़ा हिस्सा मैं निश्चित रूप से स्मृति में नहीं लेना चाहता हूं या इसे डिस्क पर भी स्टोर नहीं करना चाहता हूं।
और चूंकि मैं Load
विधि से C
का उदाहरण वापस लौटना चाहता हूं, तो मुझे किसी भी तरह से कन्स्ट्रक्टर को कॉल करना होगा।
पुराने संपादित करें:
एक अधिक जटिल उदाहरण है, जो बताते हैं क्यों मैं सवाल पूछ रहा हूँ:,
class B(object):
def __init__(self, name, data):
self._Name = name
#do something with data, but do NOT save data in a variable
@staticmethod
def Load(self, file, newName):
f = open(file, "rb")
s = pickle.load(f)
f.close()
newS = B(???)
newS._Name = newName
return newS
आप देख सकते हैं data
के बाद से एक वर्ग चर मैं नहीं कर सकता में संग्रहीत नहीं है इसे __init__
पर पास करें। बेशक मैं इसे आसानी से स्टोर कर सकता हूं, लेकिन क्या होगा यदि डेटा एक बड़ी वस्तु है, जिसे मैं हर समय स्मृति में ले जाना नहीं चाहता हूं या इसे डिस्क पर भी सहेजना नहीं चाहता हूं?
के तहत चल रहा है आप इसे किस अंत में करना चाहते हैं? –
अजीब सवाल .... वास्तव में क्या करने की कोशिश कर रहे हैं? –
मेरे पास एक "अनपिक्षित" ऑब्जेक्ट है जिसमें से मैं एक ही प्रकार की एक नई वस्तु बनाना चाहता हूं।हालांकि, इस अप्रचलित वस्तु से मेरे पास __init__ को खिलाने के लिए पर्याप्त डेटा नहीं है। सी ++ में मैं कन्स्ट्रक्टर को अधिभारित कर दूंगा और इसे निजी बनाउंगा, पायथन में मैं ^^ खो गया हूं। __init__ में वर्तमान पैरामीटर हालांकि सही समझ में आता है। यह मेरी दुर्दशा है। – Woltan