Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Пространство имен - это способ реализации области.
В Java (или C) компилятор определяет, где переменная видна при анализе статической области.
В Python каждая функция пакета, модуля, класса, функции и метода владеет «пространством имен», в котором имена переменных разрешены. Кроме того, существует глобальное пространство имен, которое используется, если имя не находится в локальном пространстве имен.
Каждое имя переменной проверяется в локальном пространстве имен (тело функции, модуль и т. Д.), А затем проверяется в глобальном пространстве имен.
Переменные обычно создаются только в локальном пространстве имен. Операторы global
и nonlocal
могут создавать переменные, отличные от локального пространства имен.
Когда функция, функция метода, модуль или пакет оцениваются (то есть начинает выполнение), создается пространство имен. Подумайте об этом как о «контексте оценки». Когда функция или функция метода и т. Д. Завершает выполнение, пространство имен отбрасывается. Переменные отбрасываются. Объекты также могут быть отброшены.
Если вы делаете большую программу с кем-то другим, вы можете написать свою часть программы по своему усмотрению. Все переменные в файле будут приватными, конфликтов не будет. Когда вы пишете PHP-программы, легко переписать глобальные переменные по ошибке. В python вы можете импортировать другие переменные модулей, если хотите, и они будут «глобальными» на вашем модуле.
Вы могли бы думать, что один файл имеет один объект в Python. Когда вы пишете PHP-программы, вы можете добиться того же, написав классы с переменными экземпляра.
Я завершаю ответ S.Lott.
Я бы сказал, пространство имен - это способ реализации управления именами внутри области видимости, потому что область действия больше, чем управление именами.
В C области действия имеют 4 типа: глобальный, функциональный, блок и функциональные параметры (прототип). Каждый из этих типов может создавать одно или несколько пространств имен, в зависимости от потребностей. В C-тегах есть 4 ns для s / u / e - идентификаторов для имен типов, имен функций и имен переменных - параметры внутри прототипа функции - члены и битовые поля внутри s / u.
Like что идентификаторы тегов и имена функций не сталкиваются, но typenames, определенные typedef, могут сталкиваться с именами переменных.
В python имеется встроенное пространство имен, которое охватывает глобальные ns, а глобальные ns предоставляются загруженный модуль. Встроенные переменные содержат переменные. Символ для переменной может определять объект или функцию - например, здесь определяется +
. Глобальные ns модуля продолжаются до завершения.
Пространства имен предотвращают конфликты между классами, методами и объектами с тем же именем, которые могли быть написаны разными людьми.
Исходя из фона Java, вы, вероятно, знакомы с тем, как это достигается с помощью пакетов, например. вы можете создать класс movieyoda.DateUtils
, и я могу создать класс mikej.DateUtils
, и пакет позволяет использовать код, используя классы, чтобы различать их. (Python имеет нечто очень похожее .)
Пространства имен были добавлены в PHP в 5.3.0, но в более ранних версиях (и на других языках, которые не предоставляют пространства имен) у вас было бы для префикса имен классов и методов с чем-то, чтобы уменьшить риск столкновения имени. например a movieyoda_parse_file
.
Чтобы понять пространства имен, вы также должны иметь некоторое представление о модулях в Python. Модуль - это просто файл, содержащий код Python. Этот код может быть в виде классов, функций или просто имен Python. Каждый модуль получает собственные глобальные пространства имен. Таким образом, вы не можете иметь два класса или две функции в одном и том же модуле с тем же именем, что и общее пространство имен модуля.
ссылка: http://bytebaker.com/2008/ 07/30 / Python-пространств имен / [/ д2]