__Init__function में नेस्टेड वेरिएबल्स प्राप्त करना

Nov 12 2020

कोड:

वर्ग GmailFarming (tk.Frame):

def __init__(self, parent, controller):
    tk.Frame.__init__(self, parent)

    def StartSeleniumScript():

        with open("json/Gmail_farming/Tasks/Tasks.json", "r") as f:
            tasksJsonFile = json.load(f)

            for task in tasksJsonFile['tasks']:
                if task['id'] == 1:

                    #Get info Needed from json

                    mode_chosen_to_run = task['mode_chosen']
                    account_chosen_to_run = task['account_chosen']

                    #Get account info from selected account

                    with open("json/Gmail_farming/Profiles/Profiles.json", "r") as acc:
                        accountsJsonFile = json.load(acc)

                        for account in accountsJsonFile['accounts']:
                            if account['id'] == 1:


                                email_for_account_to_run = account['email']
                                password_for_account_to_run = account['password']

ठीक है तो मैं कोड के इस टुकड़ा है और मूल रूप से मैं क्या करने की कोशिश कर रहा हूँ के मूल्यों को प्राप्त है email_for_account_to_run और password_for_account_to_run (जो नीचे लाइनों पर सही कर रहे हैं)। मुझे ऐसा करने में परेशानी हो रही है। मैं उन मूल्यों को किसी अन्य फ़ाइल से प्राप्त करने की कोशिश कर रहा हूं, लेकिन पायथन के लिए नए तरह का हूं और अभी भी इस तरह के विषयों के बारे में भ्रमित हूं। GmailFarming वर्ग के बाहर बहुत अधिक उन मूल्यों को प्राप्त करने के लिए किसी भी मदद के साथ बहुत अच्छा होगा! अग्रिम धन्यवाद, और PS, आईडी क्यों कोड ब्लॉक में दिखाई नहीं दे रहा है, लेकिन यह वर्ग है, और फिर इसके तहत इन्टिट इनडिट!

जवाब

KimMens Nov 22 2020 at 10:49

अपने कोड को पढ़ना, मुझे लगता है कि आप जो करने की कोशिश कर रहे हैं वह एक ऐसी __init__विधि के साथ एक वर्ग बना रहा है जो एक सहायक फ़ंक्शन StartSeleniumScriptको परिभाषित करता है जिसमें आप दो चर घोषित करते हैं email_for_account_to_runऔर password_for_account_to_runजिससे आप कक्षा के बाहर के मूल्यों को पुनर्प्राप्त करना चाहते हैं।

कम से कम मुझे आपका कोड भ्रामक लगता है क्योंकि:

  • आप कार्यात्मक शैली के साथ ऑब्जेक्ट-ओरिएंटेड स्टाइल प्रोग्रामिंग को मिक्स करते हैं (इसके बजाय आप startSeleniumScript(self)उसी स्तर पर एक सहायक विधि बना सकते थे जितना कि __init__इसके अंदर एक फंक्शन डेफिनेशन को नेस्टिंग करने के बजाय विधि)
  • आपके द्वारा बनाया गया नेस्टेड फ़ंक्शन भी कभी नहीं बुलाया जाता है
  • आपके द्वारा बनाए गए नेस्टेड फ़ंक्शन का कोई returnमूल्य नहीं है
  • कक्षा में __init__विधि में घोषित कोई उदाहरण चर नहीं है
  • आप कभी भी कक्षा का एक उदाहरण नहीं बनाते हैं

यह सब मुझे थोड़ा हैरान करता है कि आप वास्तव में क्या करना चाहते हैं लेकिन ऐसा कुछ काम करेगा:

class GmailFarming:
    
    def __init__(self, parent, controller):
        
        def StartSeleniumScript():
            self.foo = 1
            self.bar = 2
        
        StartSeleniumScript()
        
g = GmailFarming(None,None)
print(g.foo)
print(g.bar)

संक्षेप में, आप self.उन चरों के सामने जोड़ते हैं जिन्हें आप एक्सेस करना चाहते हैं ताकि वे उदाहरण चर बन जाएं जिन्हें आप बाहर से एक्सेस कर सकते हैं। और निश्चित रूप से आपको पहले कक्षा का एक ऑब्जेक्ट बनाना होगा इससे पहले कि आप इसके बाहर के उदाहरण चर प्राप्त कर सकें।

व्यक्तिगत रूप से, मैंने नेस्टेड फ़ंक्शन को इस तरह से एक सहायक विधि के रूप में परिभाषित किया होगा:

class GmailFarming:
    
    def __init__(self, parent, controller):
        self.__startSeleniumScript()
        
    def __startSeleniumScript(self):
        self.foo = 1
        self.bar = 2
    
g = GmailFarming(None,None)
print(g.foo)
print(g.bar)