__İnit__function içinde İç içe Değişkenleri Alma

Nov 12 2020

Kod:

sınıf 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']

Tamam, bu kod yığınına sahibim ve temelde yapmaya çalıştığım şey, email_for_account_to_run ve password_for_account_to_run (en alt satırlarda) değerlerini almak. Bunu yapmakta zorlanıyorum. Bu değerleri başka bir dosyadan almaya çalışıyorum, ancak Python'da biraz yeniyim ve hala bunun gibi konular hakkında kafam karışık. Bu değerlerin GmailFarming sınıfının hemen hemen dışından nasıl alınacağına dair her türlü yardım harika olurdu! Şimdiden teşekkürler ve PS, sınıfın neden kod bloğunda görünmediğini, ancak sınıfın olduğunu ve ardından def init'in altına girintili olduğunu anlayın!

Yanıtlar

KimMens Nov 22 2020 at 10:49

Kodunuzu okumak, ne yapmaya çalışıyoruz bir sahip bir sınıf oluşturarak olduğunu varsayalım __init__yardımcı bir işlev tanımlar yöntemle StartSeleniumScriptiki değişkenleri bildirmek hangi email_for_account_to_runve password_for_account_to_runhangi dışarıda sınıfın değerlerini kurtarmak istiyorum.

En azından kodunuzu kafa karıştırıcı buluyorum çünkü:

  • nesne yönelimli stil programlamayı işlevsel stille karıştırırsınız (bunun yerine startSeleniumScript(self), __init__bir işlev tanımını içine yerleştirmek yerine , yöntemle aynı düzeyde yardımcı bir yöntem oluşturmuş olabilirsiniz)
  • oluşturduğunuz iç içe geçmiş işlev asla çağrılmaz
  • oluşturduğunuz iç içe geçmiş işlevin returndeğeri yok
  • sınıfın __init__yöntemde bildirilmiş bir örnek değişkeni yok
  • asla sınıfın bir örneğini yaratmazsın

Bütün bunlar tam olarak ne yapmak istediğiniz konusunda beni biraz şaşırttı ama bunun gibi bir şey işe yarayacak:

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)

Temelde, self.erişmek istediğiniz değişkenlerin önüne bir eklersiniz, böylece dışarıdan erişebileceğiniz örnek değişkenler olurlar. Ve elbette, örnek değişkenlerini ondan çıkarabilmeniz için önce sınıfın bir nesnesini oluşturmanız gerekir.

Kişisel olarak, iç içe geçmiş işlevi bunun gibi bir yardımcı yöntem olarak tanımlardım, ancak:

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)