Почему я могу написать некоторые вещи не в порядке в Python, но не другие? - PullRequest
1 голос
/ 13 мая 2011

Пожалуйста, посмотрите ниже:

a = 5
print a + b
b = 4

Когда я пытаюсь запустить приведенный выше код, выдает ошибку: Traceback (последний вызов был последним): Файл "C: /Users/user/Documents/modules/ab.py", строка 2, в напечатать а + б NameError: имя 'b' не определено

Ok. a + b вызывается до определения b. Это означает, что Python выполняет код по порядку, начиная сверху вниз. Но как насчет этого:

class Data:
    def __init__(self):
        self.debug_level = 9
        self.assign = [0, 0, 0, 0]
        self.days = 0
    def create_days(self, startTime, endTime):

        res = 0
        try:
          if self.final_days < self.maximum_days:

Выше, self.final_days и self.maximum_days также еще не определены, но это не дает никаких ошибок. Какая логика стоит за этим?

С уважением,

Ответы [ 6 ]

5 голосов
/ 13 мая 2011

На самом деле вы еще не "запускаете" код. В вашем примере все, что у вас есть, - это объявление метода внутри класса Data. В нем Python не будет проверять существование полей классов, потому что они могут быть установлены в другое время, в каком-то другом методе (классы Python являются гибкими в этом смысле).

Если вы попытаетесь запустить метод create_days в новом экземпляре класса Data без предварительной установки значений для этих полей, вы получите ошибку.

4 голосов
/ 13 мая 2011

Это не дает никаких ошибок, потому что атрибуты не доступны при определении класса.Как только вы позвоните create_days(), у вас возникнет проблема: D

2 голосов
/ 13 мая 2011

Тело функции оценивается только тогда, когда она вызывается, а не когда она определена.

1 голос
/ 13 мая 2011

Если вы действительно выполнили его, вы получите AttributeError: Экземпляр данных не имеет атрибута 'final_days'

Для воспроизведения этого:

x = Data()
x.create_days(1,2)

также у вас есть блок try,Я предполагаю, что это выдержка из некоторого другого кода.Блок try, вероятно, поглощает исключение.

1 голос
/ 13 мая 2011

Ссылки ищутся только при запуске кода.Вы можете поместить любые имена, которые вам нравятся, в метод create_days(), и ни одно из них не будет проверено до тех пор, пока не будет выполнена строка, содержащая их.

0 голосов
/ 13 мая 2011

Python - интерпретируемый язык, в отличие от c ++, он не компилируется, поэтому тело функции не вычисляется до тех пор, пока она не будет вызвана.

...