Как получить значение объектов / переменных из одной функции в другую и вызвать две функции по главной? - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь получить значения из kindle () и обработать их в bundle () и вызвать эти две функции в main, но я получаю ошибку: NameError: имя 'x' не определено в bundle () первая строка, а x объявлен глобально.

class Program:

    x = 0
    y = 0
    def kindle(self):
        x = 2
        y = 3
    return x, y

    def bundle(self):
        z = x+ y
        print(z)

def main():
    p = Program()
    p.kindle()
    p.bundle()
if __name__ == "__main__":
    main()

1 Ответ

1 голос
/ 24 апреля 2020

Ах, обсуждение классов. Таким образом, x и y, которые вы определили «глобально», на самом деле не являются глобальными, они являются объектами класса и доступны из класса. Например,

class thing:
    x = 10
    def func(self):
        print(thing.x)

Обратите внимание, что «x» присоединен к классу «вещь». Следовательно, «х» не является глобальным. В общем, все внутри класса доступно через класс и не отделено от внешнего пространства.

Конечно, одно из ОСНОВНЫХ преимуществ использования классов состоит в том, что все функции и переменные имеют общее пространство имен. Экземпляр этого пространства имен называется «self» и автоматически передается всем функциям класса. Следовательно, делать "thing.x" совершенно не нужно (и требует, чтобы я знал имя класса). Вместо этого мы можем сделать:

class thing:
    x = 10
    def func(self):
        print(self.x)

Мы можем, конечно, go дальше. Если я могу всегда обращаться к себе в классе, то, если я присоединяюсь к себе, другие функции смогут автоматически видеть это вложение. Давайте попробуем:

class Program:

    x = 0 #Default value if we don't overwrite. 
    y = 0 #Default value if we don't overwrite. 

    def kindle(self):
        self.x = 2 #Overwrote the default. 
        self.y = 3 #Overwrote the default. 
        #No need to return anything. Self already has x and y attached.

    def bundle(self):
        z = self.x + self.y
        print(z)
        #z is not attached to self, hence z is only available in this function. 

def main():
    p = Program() #Create an instance of the Program class. 
    p.kindle()    #Overwrite the default x and y values for just this instance.
    p.bundle()    #Add the values and print. 

if __name__ == "__main__":
    main()
...