Как сделать импорт в классе global в python? [Дубликат]

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
34
задан Ray Toal 5 May 2015 в 01:58
поделиться

5 ответов

Пространство имен - это способ реализации области.

В Java (или C) компилятор определяет, где переменная видна при анализе статической области.

  • В C область видимости - это либо тело функции, либо глобальная, либо внешняя. Компилятор объясняет это вам и решает каждое имя переменной на основе правил области. Внешние имена разрешаются компоновщиком после того, как все модули скомпилированы.
  • В Java область - это тело функции метода или все методы класса. Некоторые имена классов также имеют область модульного уровня. Опять же, компилятор вычисляет это во время компиляции и решает каждое имя на основе правил области.

В Python каждая функция пакета, модуля, класса, функции и метода владеет «пространством имен», в котором имена переменных разрешены. Кроме того, существует глобальное пространство имен, которое используется, если имя не находится в локальном пространстве имен.

Каждое имя переменной проверяется в локальном пространстве имен (тело функции, модуль и т. Д.), А затем проверяется в глобальном пространстве имен.

Переменные обычно создаются только в локальном пространстве имен. Операторы global и nonlocal могут создавать переменные, отличные от локального пространства имен.

Когда функция, функция метода, модуль или пакет оцениваются (то есть начинает выполнение), создается пространство имен. Подумайте об этом как о «контексте оценки». Когда функция или функция метода и т. Д. Завершает выполнение, пространство имен отбрасывается. Переменные отбрасываются. Объекты также могут быть отброшены.

40
ответ дан S.Lott 18 August 2018 в 23:30
поделиться
  • 1
    namespace - это способ реализации управления именами внутри области видимости, поскольку область действия больше, чем управление именами. см. мой ответ. – alinsoar 9 October 2016 в 23:18

Если вы делаете большую программу с кем-то другим, вы можете написать свою часть программы по своему усмотрению. Все переменные в файле будут приватными, конфликтов не будет. Когда вы пишете PHP-программы, легко переписать глобальные переменные по ошибке. В python вы можете импортировать другие переменные модулей, если хотите, и они будут «глобальными» на вашем модуле.

Вы могли бы думать, что один файл имеет один объект в Python. Когда вы пишете PHP-программы, вы можете добиться того же, написав классы с переменными экземпляра.

0
ответ дан Adam Wallner 18 August 2018 в 23:30
поделиться

Я завершаю ответ S.Lott.

Я бы сказал, пространство имен - это способ реализации управления именами внутри области видимости, потому что область действия больше, чем управление именами.

В C области действия имеют 4 типа: глобальный, функциональный, блок и функциональные параметры (прототип). Каждый из этих типов может создавать одно или несколько пространств имен, в зависимости от потребностей. В C-тегах есть 4 ns для s / u / e - идентификаторов для имен типов, имен функций и имен переменных - параметры внутри прототипа функции - члены и битовые поля внутри s / u.

Like что идентификаторы тегов и имена функций не сталкиваются, но typenames, определенные typedef, могут сталкиваться с именами переменных.

В python имеется встроенное пространство имен, которое охватывает глобальные ns, а глобальные ns предоставляются загруженный модуль. Встроенные переменные содержат переменные. Символ для переменной может определять объект или функцию - например, здесь определяется +. Глобальные ns модуля продолжаются до завершения.

См. Также , что и, конечно, , что .

0
ответ дан alinsoar 18 August 2018 в 23:30
поделиться

Пространства имен предотвращают конфликты между классами, методами и объектами с тем же именем, которые могли быть написаны разными людьми.

Исходя из фона Java, вы, вероятно, знакомы с тем, как это достигается с помощью пакетов, например. вы можете создать класс movieyoda.DateUtils, и я могу создать класс mikej.DateUtils, и пакет позволяет использовать код, используя классы, чтобы различать их. (Python имеет нечто очень похожее .)

Пространства имен были добавлены в PHP в 5.3.0, но в более ранних версиях (и на других языках, которые не предоставляют пространства имен) у вас было бы для префикса имен классов и методов с чем-то, чтобы уменьшить риск столкновения имени. например a movieyoda_parse_file.

5
ответ дан mikej 18 August 2018 в 23:30
поделиться

Чтобы понять пространства имен, вы также должны иметь некоторое представление о модулях в Python. Модуль - это просто файл, содержащий код Python. Этот код может быть в виде классов, функций или просто имен Python. Каждый модуль получает собственные глобальные пространства имен. Таким образом, вы не можете иметь два класса или две функции в одном и том же модуле с тем же именем, что и общее пространство имен модуля.

ссылка: http://bytebaker.com/2008/ 07/30 / Python-пространств имен / [/ д2]

3
ответ дан shahjapan 18 August 2018 в 23:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: