Как вызвать значение параметра вне функции под классом? - PullRequest
0 голосов
/ 07 сентября 2018

Вот один пример кода ниже.Я хотел бы вызвать значение параметра, которое создается внутри функции внутри класса, извне любой функции, скажем, из оболочки python ...

Сначала я попытался вызвать его с помощью экземпляракласс, созданный мной как:

tc.process_time_in_seconds

в консоли оболочки python и после запуска кода и строки tc.process_time_in_seconds в оболочке возвращает:

NameError: name 'tc' is not defined

в результате ... поэтому мне нужно найти способ сделать это правильно.Я предполагаю предопределение tc вне любого класса или функции.Я не уверен, как бы я сделал это правильно .. Любая помощь будет оценена.

import time
import datetime

class TimeCounter:

    def startTime(self):

        self.start_time_of_the_script = time.time()


    def endTime(self):

        self.end_time_of_the_script = time.time()
        self.process_time_in_seconds = self.end_time_of_the_script - self.start_time_of_the_script
        print(datetime.timedelta(seconds=self.process_time_in_seconds))


def main():

    tc = TimeCounter()
    tc.startTime()
    tc.endTime()

main()

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Как уже указывалось @poke, вы не можете ссылаться на этот элемент больше. Вы создали tc как локальную переменную в функции main. Вы вызвали несколько методов экземпляра, которые устанавливают атрибуты, а затем оставили область действия tc - это main. Вы не смогли ничего сделать, чтобы сделать объект доступным за пределами main. Самый простой способ - вернуть объект, например так:

def main():

    tc = TimeCounter()
    tc.startTime()
    tc.endTime()
    return tc

outer = main()
print(outer.process_time_in_seconds)   # proof of concept ... not within the interpreter.

Выход:

0:00:00.000003
2.6226043701171875e-06
0 голосов
/ 07 сентября 2018

Причина, по которой вы не можете получить доступ к tc извне main, заключается в том, что это локальная переменная. Локальные переменные существуют только внутри функции, которая их создает; как только эта функция вернется, переменные исчезнут навсегда.

Полагаю, предопределение tc вне какого-либо класса или функции. Я не уверен, как бы я сделал это правильно ..

То, что вы спрашиваете, это как изменить tc с локальной переменной на глобальную переменную.


В общем, это действительно плохая идея. Если вы хотите, чтобы значение сохранялось после выполнения функции, лучшим решением будет return значение:

def main():    
    tc = TimeCounter()
    tc.startTime()
    tc.endTime()
    return tc

… а затем попросите абонента сохранить его:

t = main()

Теперь у вас есть переменная с именем t в той же области, что и вызов main(), с тем же значением, что и локальная tc. Итак, в вашем интерактивном сеансе вы можете просто сделать это:

t.process_time_in_seconds

Я дал t имя, отличное от tc, просто чтобы было очевидно, что две переменные являются несвязанными именами для одного и того же значения. Если вы хотите использовать одно и то же имя для обоих, это тоже хорошо.


Но иногда - особенно когда делаешь вещи в интерактивной интерпретации - глобальные переменные действительно проще. Всякий раз, когда вы пытаетесь найти глобальную переменную, вам следует остановиться и спросить, есть ли лучший способ сделать это. Но когда этого не происходит, вот как вы это делаете: добавьте оператор global в начале функции.

def main():
    global tc
    tc = TimeCounter()
    tc.startTime()
    tc.endTime()

Теперь вместо создания локальной переменной с именем tc функция main создает или изменяет глобальную переменную с именем tc. Итак, после вызова main() вы можете получить доступ к этой глобальной переменной:

tc.process_time_in_seconds

В зависимости от того, какие интерактивные материалы вы планируете делать, это может быть так же хорошо, как версия return и немного проще, или может вызывать ненужные проблемы или ограничения, такие как невозможность вызова main() дважды и вернуть два разных значения. Если вы не знаете, всегда ошибайтесь, если не используете глобальные переменные. Но когда ты знаешь, что хочешь, иди.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...