Что такое пространства имен Python
Я только начал изучать Python и столкнулся с концепцией "пространства имен" в Python. Пока я понял суть того, что это такое, но не в состоянии оценить серьезность этого понятия.
Некоторые просмотры в Сети показали, что одна из причин, идущих против PHP, заключается в том, что он не имеет собственной поддержки пространств имен.
Может кто-нибудь объяснить, как использовать пространства имен и как эта функция делает программирование лучше (не только в Python, как я предполагаю, пространства имен в not a понятие, ограниченное конкретным языком).
Я в основном исхожу из программ на Java и C.
5 ответов:
Пространство имен-это способ реализации области видимости.
В Java (или C) компилятор определяет, где переменная видна с помощью статического анализа области видимости.
В языке C область видимости - это либо тело функции, либо она является глобальной, либо она является внешней. Компилятор объясняет это для вас и разрешает каждое имя переменной на основе правил области. Внешние имена разрешаются компоновщиком после компиляции всех модулей.
В Java scope-это тело функции метода, или все методы класса. Некоторые имена классов также имеют область на уровне модуля. Опять же, компилятор вычисляет это во время компиляции и разрешает каждое имя на основе правил области.
В Python каждому пакету, модулю, классу, функции и методу принадлежит "пространство имен", в котором разрешаются имена переменных. Кроме того, существует глобальное пространство имен, которое используется, если имя не находится в локальном пространстве имен.
Каждое имя переменной проверяется в локальном пространстве имен (теле функция, модуль и т. д.), а затем проверяется в глобальном пространстве имен.
Переменные обычно создаются только в локальном пространстве имен. Операторыglobalиnonlocalмогут создавать переменные, отличные от локального пространства имен.При вычислении функции, метода, модуля или пакета (то есть при запуске выполнения) создается пространство имен. Думайте об этом как об "оценочном контексте". Когда функция или метод функции и т. д., завершает выполнение, пространство имен удаляется. То переменные отбрасываются. Предметы также могут быть отброшены.
Пространства имен предотвращают конфликты между классами, методами и объектами с одинаковыми именами, которые могли быть написаны разными людьми.
Исходя из фона Java, вы, вероятно, знакомы с тем, как это достигается с помощью пакетов, например, вы можете создать класс
movieyoda.DateUtils, а я могу создать классmikej.DateUtils, и пакет позволяет коду, использующему классы, различать их. (У Python есть что-то очень похожее.)Пространства имен были добавлены в PHP в 5.3.0, но в в более ранних версиях (и в других языках, которые не предоставляют пространства имен) имена классов и методов должны были бы иметь префикс, чтобы уменьшить риск столкновения имен. например, функция
movieyoda_parse_file.
Чтобы понять пространства имен, вы также должны иметь некоторое представление о модулях в Python. Модуль-это просто файл, содержащий код Python. Этот код может быть в виде классов Python, функций или просто списка имен. Каждый модуль получает свои собственные глобальные пространства имен. Таким образом, вы не можете иметь два класса или две функции в одном модуле с одинаковым именем, поскольку они совместно используют пространство имен модуля.
Если вы делаете большую программу с кем-то другим, вы можете написать свою собственную часть программы, как вы хотите. Все переменные в файле будут приватными, коллизий не будет. Когда вы пишете программы на PHP, легко переписать глобальные переменные по ошибке. В python вы можете импортировать другие переменные модулей, если хотите, и они будут "глобальными" в вашем модуле.
Вы можете думать, что один файл - один объект в Python. Когда вы пишете PHP-программы, вы можете достичь того же, написав классы с переменными экземпляра.
Я завершаю ответ С. Лотта.
Я бы сказал, что пространство имен-это способ реализовать управление именами внутри области, потому что область делает больше, чем управление именами.В языке C области видимости имеют 4 типа: глобальные, функциональные, блочные и функции-параметры (прототип). Каждый из этих типов может создать одно или несколько пространств имен, в зависимости от потребностей. Есть 4 НС в C -- метки для s / u/e -- идентификаторы для имен типов, имен функций и имен var -- параметры внутри прототипа функции -- члены и битовые поля внутри s/u.
Таким образом, идентификаторы тегов и имена функций не сталкиваются, но имена типов, определенные typedef, могут сталкиваться с именами переменных.
В python есть встроенное пространство имен, которое включает глобальный ns, и глобальный ns предоставляется загруженным модулем. Встроенные ns содержат переменные. Символ переменной может определять объект или функцию - например, здесь определяется
См. также , чтои, конечно, , что.+. Глобальный ns модуля длится до прекращение.
Comments