Как получить доступ к переменным из функций, находящихся внутри класса, из файла kivy?

#python #function #class #kivy #kivymd

#питон #функция #класс #киви #кивимд

Вопрос:

Я знаю, что мы можем получить доступ к переменным, объявленным в основном классе приложения. Это можно сделать с помощью «app.NameOfTheVariable», например, доступ к строковому значению:

 #Python file from kivymd.app import MDApp from kivymd.uix.boxlayout import MDBoxLayout  class MainScreen(MDBoxLayout):  pass  class MainApp(MDApp):  App_Name = "Galasken Proyect 001"  MainApp.run()    #Kivy file MainScreen: lt;MainScreengt;:  MDLabel:  text: app.App_name     

Однако я хочу знать, как мы можем получить доступ к переменным, которые находятся внутри функции, которая находится внутри класса. Например, в следующем коде, как я могу получить доступ к «Имя_объекта»

 #Python file from kivymd.app import MDApp from kivymd.uix.boxlayout import MDBoxLayout  class MainScreen(MDBoxLayout):  pass  class MainApp(MDApp):  App_Name = "App Example"   def a_function(self):  Object_name = "this is a name"  MainApp.run()  

Я пробовал разные вещи в файле kivy, но ничего не получилось. Это то, что я пробовал:

 #Kivy file MainScreen: lt;MainScreengt;:  MDLabel:  text: app.a_function().App_name  # text: app.a_function.App_name  # text: app.App_name   

Что я могу сделать, чтобы получить доступ к этой переменной?

Ответ №1:

Переменная Object_name в функции a_function недоступна для вас, потому что она «локальна» в области действия функции.

Единственное, что вы можете сделать, это:

 def a_function(self):  self.Object_name = "this is a name"  

Это будет размещено Object_name в области MainApp и может быть доступно по app.Object_name

NB: Это может быть побочным эффектом. Переменная Object_name — член в MainApp не существует до тех пор, пока вы не вызовете a_function() . Если вы попытаетесь получить доступ app.Object_name до вызова этой функции, вы получите сообщение об ошибке о несуществующем атрибуте.

Вы можете остановить этот побочный эффект, добавив self.Object_name в свой __init__ метод конструктора. В качестве альтернативы вы можете просто a_function() вернуть эту строку напрямую.

 def a_function(self):  Object_name = "this is a name"  return Object_name