Ява - это не Питон. Питон это не Ява. Вы только что обнаружили здесь много различий; больше, чем вы ожидаете.
В Java имя файла совпадает с именем основного класса плюс расширение .java. В питоне в чем дело?
Наоборот: имя файла не обязательно совпадает с чем-либо.
В примерах официальных руководств они пишут несколько классов и не упоминают имя файла. Я немного потерян.
Потому что это не имеет значения. (Обратите внимание, что в Java у вас все еще может быть более одного класса в файле, если только один с соответствующим именем — public. В Python public на самом деле не существует.)
Для списка1 и списка2: я получаю-
Неопределенная переменная: list1 list Найдено по адресу: test_pie
Неопределенная переменная: список list2 Найдено по адресу: test_pie
Это связано с тем, что эти атрибуты (то, что вы бы назвали «полями» в Java) принадлежат классу, а не объекту.
Метод (то же имя, что и в Java) по-прежнему «принадлежит» классу в Python-думании, но доступ к нему осуществляется через объект. Вот почему вам нужен явный параметр self для методов Python: потому что my_object.do_something(x, y, z) неявно переводится в MyClass.do_something(my_object, x, y, z) (более или менее; за кулисами есть некоторая хитрость с «привязкой», которая позволяет вам рассматривать my_object.do_something как объект. Да, в Python , все является объектом, даже функции. А вы думали, что Java — это объектно-ориентированное программирование. Ха.)
Вы по-прежнему можете получить доступ к атрибутам класса через объект, если вы укажете Python, где его искать. Внутри PrintList, list1 и list2 не находятся в области действия, потому что Python действительно имеет только две области действия: локальную и глобальную. Но self находится в области (это параметр, поэтому он находится в локальной области), и вы можете получить доступ к self.list1, поскольку поиск атрибута объекта в Python возвращается к атрибутам класса, если атрибут объекта отсутствует. (На самом деле все гораздо сложнее: есть пара различных хуков с именами специальных методов, которые вы можете вставить в процесс, не говоря уже о том, как обрабатывается наследование.)
Итак, вы, вероятно, сейчас задаетесь вопросом, как получить атрибуты в реальном объекте Python, а не в его классе. Ответ: вы просто назначаете их. Если вы не ставите никаких ограничений, то вы можете назначить их в любое время, с любым именем. Объект в основном просто словарь. Если вы знакомы с Java*script* (язык, совершенно не связанный с Java), то он работает примерно так же. Однако, чтобы контролировать это безумие, обычно назначают начальные значения атрибутов в методе со специальным именем __init__, который автоматически вызывается (если он найден) сразу после создания объекта (но это не). конструктор в обычном смысле; эту роль играет __new__, но на самом деле он почти никогда не нужен в Python), а затем только переназначать атрибуты, которые были установлены там, а не создавать новые.
Вы можете установить ограничения, если у вас есть класс нового стиля (автоматический в 3.x; в 2.x вы должны наследовать хотя бы косвенно от встроенного типа object), указав значение для специально названного атрибута класса называется __slots__. Это должен быть список строк, которые являются допустимыми именами идентификаторов. При этом Python будет (а) использовать информацию для оптимизации своего внутреннего хранилища данных для объектов; (b) запретить вам добавлять к объекту атрибуты с другими именами; (c) запретить создание специального атрибута __dict__ для экземпляров объекта, который представляет собой словарь, отображающий имена атрибутов в значения атрибутов. (А вы думали, что Java поддерживает отражение. Ха.) Он не автоматически присваивает значения именованным атрибутам; попытка получить к ним доступ до того, как они были назначены, приведет к raise AttributeError.
person
Karl Knechtel
schedule
10.07.2011