Почему синтаксис для open () и .read () отличается? - PullRequest
1 голос
/ 01 апреля 2012

Это вопрос новичка, но я огляделся по сторонам, и у меня возникли проблемы с поиском чего-то конкретного для этого вопроса (возможно, потому что это слишком просто / очевидно для других).

Итак, я работаю над «Изучить Python - трудный путь» Зеда Шоу и выполняю упражнение 15. Это не первое знакомство с Python, но на этот раз я действительно пытаюсь понять его на более фундаментальной основе. уровень, так что я действительно могу сделать что-то с языком программирования за один раз. Я также должен предупредить, что у меня нет хорошего фона в объектно-ориентированном программировании или я полностью не знаю, что такое объекты, классы и т. Д.

В любом случае, вот упражнение. Идея состоит в том, чтобы понять основы открытия и чтения файлов:

from sys import argv

script, filename = argv

txt = open(filename)

print "Here's your file %r:" % filename
print txt.read()

print "I'll also ask you to type it again:"
file_again = raw_input("> ")

txt_again = open(file_again)

print txt_again.read()

txt.close()
txt_again.close()

Мой вопрос: почему функции open и read используются по-разному?

Например, чтобы прочитать файл примера, почему я не могу / не могу набрать print read(txt) в строке 8?
Почему я ставлю точку перед переменной и функцией после нее?
В качестве альтернативы, почему в строке 5 не написано txt = filename.open()?

Это меня так смущает. Это просто, что некоторые функции имеют один синтаксис, а другие другой синтаксис? Или я что-то не понимаю относительно того, как передавать переменные в функции.

Ответы [ 3 ]

4 голосов
/ 01 апреля 2012

Синтаксис

Специально для синтаксических различий: open () - это функция, read () - это объект метод .

Когда вы вызываете функцию open () , она возвращает объект (сначала txt , затем txt_again ).

txt - это объект класса file .Объекты класса file определяются методом read () .Итак, в вашем коде выше:

txt = open(filename)

Вызывает функцию open () и назначает объект класса file в txt .

Впоследствии код:

txt.read()

вызывает метод read () , связанный с объектом txt .

Объекты

В этом сценарии важно понимать, что объекты определяются не только как объекты данных, но также со встроенными действиями против этих объектов.

Например, гипотетический объект класса car может быть определен с помощью методов , таких как start_engine () , stop_engine () , open_doors () и т. Д.

Таким образом, в качестве примера вышеупомянутого файла, код для создания и использования автомобиля может быть:

my_car = create_car(type_of_car)
my_car.start_engine()

(запись в Википедии на ООП.)

2 голосов
/ 01 апреля 2012

Чтобы ответить на этот вопрос, вы должны иметь некоторое представление об объектно-ориентированном программировании.

open () - нормальная функция, а первый параметр - строка с путем к файлу.Возвращаемое значение этой функции - объект.

Дальнейшая работа выполняется с использованием этого объекта.У объекта также есть функции, но они называются методами.Эти методы вызываются в контексте этого объекта, и точка соединяет объект с методом.Таким образом, txt.read () означает, что вы вызываете метод чтения из объекта txt.

Но если вы действительно хотите это понять, вам следует взглянуть на ООП.

0 голосов
/ 01 апреля 2012

Вы сталкиваетесь с методами против функций.

open - это глобальная функция, и в качестве параметров она принимает просто то, что заключено в скобки.

read - это метод файловых объектов. Выражение txt.read() вызывает метод read объекта txt. Под капотом объект txt передается как первый параметр его метода read. Метод read будет определен примерно так:

class File(object):
     def read(self):
         # do whatever here
         # self is whatever object appears to the left of the dot in foo.read

Из приведенного выше определения следует, что вы можете использовать метод, подобный read, только для объекта, для которого определен метод чтения.

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