首页 > 解决方案 > 在 __init__function 中获取嵌套变量

问题描述

代码:

类 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_runpassword_for_account_to_run的值(就在底线)。我这样做有困难。我正在尝试从另一个文件中获取这些值,但是对 Python 来说有点陌生,并且仍然对这样的主题感到困惑。任何有关如何从 GmailFarming 类之外获取这些值的帮助都会很棒!在此先感谢,并且 PS,我知道为什么类没有出现在代码块中,但它是类,然后在它下面缩进了 def init !

标签: pythonfunctionclassscope

解决方案


阅读您的代码,我假设您尝试做的是创建一个具有__init__定义辅助函数的方法的类,在该辅助函数StartSeleniumScript中您声明两个变量email_for_account_to_runpassword_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)

推荐阅读