- Класс Python __init__ Не работает
- Почему мой __init__.py не работает в модуле?
- 2 ответа
- Код и объяснение каталога:
- Давайте начнем импортировать вещи:
- Конструктор класса – метод __init__()
- Практическая работа. Конструктор и деструктор
- Файл __init__ не работает должным образом в python
- Pygame.init() not working [duplicate]
- 3 Answers 3
- Not the answer you’re looking for? Browse other questions tagged python pygame init or ask your own question.
- Linked
- Related
- Hot Network Questions
Класс Python __init__ Не работает
Это какой-то действительно простой код, который я использую с sqlalchemy, и мне не хватает чего-то основного здесь о том, как работают классы.
Выполняется следующий запрос:
но следующий запрос возвращает ошибку:
У меня также есть еще более основная проблема, когда я запрашиваю класс Game, он не распечатывает «привет». Так может кто-то объяснить, почему «привет» не распечатывается каждый раз, когда я использую экземпляр игры? И второй вопрос: как я могу построить и получить доступ к элементу away_dictionary, который я хочу иметь для каждого экземпляра этого класса?
спасибо за комментарии. это просто я или sqlalchemy вроде сбивает с толку?
в любом случае, как указывали люди выше, метод __init__ , по-видимому, не вызывается, когда вы выполняете запрос.
ORM SQLAlchemy не вызывает __init__ при воссоздании объектов из строки базы данных. Процесс ORM несколько похож на Python стандартный библиотечный модуль pickle, вызывающий низкий уровень __new__ метод, а затем тихо восстанавливая атрибуты непосредственно на экземпляре вместо вызова __init__ .
решением этого является добавление следующего кода:
эта функция будет действовать как реальный __init__ и вызывается при каждом создании объекта.
Ага. Я как раз собирался указать, что это странно, что stuff не найден, и я ожидал бы, что away_dictionary не будет найден вместо этого. и вы отредактировали сообщение и изменили сообщение об ошибке, которое вы цитируете, Это действительно away_dictionary , который не находит, потому что он обычно создается в вашем классе __init__() , а __init__() не вызван.
Обычно при создании экземпляра вызывается __init__() , но когда вы используете этот класс в запросах SQLAlchemy, он пропускает метод __init__() . Я подозреваю, что это связано с тем, как работает SQLAlchemy declarative_mapper , но я достаточно ржав на SQLAlchemy, что не знаю, как это исправить. Если я узнаю, я отредактирую этот ответ позже и скажу вам.
Но на данный момент вы, вероятно, не должны полагаться на свой метод __init__() , вызываемый в объектах модели SQLAlchemy (т.е. что-либо, полученное из Base ). Посмотрите, можете ли вы структурировать свой код каким-либо другим способом.
Источник
Почему мой __init__.py не работает в модуле?
Я пытаюсь добавить ‘project_root’ в __init__.py и все модули могут использовать его, но это не работает.
Окружение: Python 3.7.0 MACOS MOJAVE
Коды в файле __init__.py :
И в другом файле
Если я запускаю python a.py в том же каталоге или запускаю python a.py из каталога, ошибка будет такой же:
У меня вопрос, почему это не работает и как это исправить. Другой вопрос: что, если вы хотите поделиться некоторыми переменными для других модулей в одном пакете, как это сделать?
2 ответа
Давайте попробуем понять на примере.
Код и объяснение каталога:
Предположим, у нас есть следующая структура каталогов и файлов:
Давайте начнем импортировать вещи:
Предположим, у вас есть следующий код в b.py :
Выполнение вышеизложенного даст следующий вывод:
Распечатать заявление от init
func из a.py
Итак, из вышесказанного мы понимаем, что оператор print из __init__.py выполняется. Теперь давайте добавим print(project_root) в b.py :
Выполнение вышеизложенного приведет к ошибке, говорящей:
.
NameError: имя ‘project_root’ не определено
Это произошло из-за того, что нам не пришлось импортировать оператор print из __init__.py , который только что был выполнен. Но это не так для переменной.
Давайте попробуем импортировать переменную и посмотрим, что произойдет:
Выполнение вышеуказанного файла даст следующий вывод:
Распечатать заявление от init
func от a.py
/ home / user / some / directory / name / dir_1
Короче говоря , вам нужно импортировать переменную, определенную в __init__.py или в другом месте, чтобы использовать его.
Источник
Конструктор класса – метод __init__()
В объектно-ориентированном программировании конструктором класса называют метод, который автоматически вызывается при создании объектов. Его также можно назвать конструктором объектов класса. Имя такого метода обычно регламентируется синтаксисом конкретного языка программирования. Так в Java имя конструктора класса совпадает с именем самого класса. В Python же роль конструктора играет метод __init__().
В Python наличие пар знаков подчеркивания спереди и сзади в имени метода говорит о том, что он принадлежит к группе методов перегрузки операторов. Если подобные методы определены в классе, то объекты могут участвовать в таких операциях как сложение, вычитание, вызываться как функции и др.
При этом методы перегрузки операторов не надо вызывать по имени. Вызовом для них является сам факт участия объекта в определенной операции. В случае конструктора класса – это операция создания объекта. Так как объект создается в момент вызова класса по имени, то в этот момент вызывается метод __init__().
Необходимость конструкторов связана с тем, что нередко объекты должны иметь собственные свойства сразу. Пусть имеется класс Person, объекты которого обязательно должны иметь имя и фамилию. Если класс будет описан подобным образом
то создание объекта возможно без полей. Для установки имени и фамилии метод set_name() нужно вызывать отдельно:
В свою очередь, конструктор класса не позволит создать объект без обязательных полей:
Здесь при вызове класса в круглых скобках передаются значения, которые будут присвоены параметрам метода __init__(). Первый его параметр – self – ссылка на сам только что созданный объект.
Теперь, если мы попытаемся создать объект, не передав ничего в конструктор, то будет возбуждено исключение, и объект не будет создан:
Однако бывает, что надо допустить создание объекта, даже если никакие данные в конструктор не передаются. В таком случае параметрам конструктора класса задаются значения по умолчанию:
Если класс вызывается без значений в скобках, то для параметров будут использованы их значения по умолчанию. Однако поля width и height будут у всех объектов.
Кроме того, конструктору вовсе не обязательно принимать какие-либо параметры, не считая self. Значения полям могут назначаться как угодно. Также не обязательно, чтобы в конструкторе происходила установка атрибутов объекта. Там может быть, например, код, который порождает создание объектов других классов.
В других языка программирования, например в Java, классы могут содержать несколько конструкторов, которые между собой отличаются количеством параметром, а также, возможно, их типом. При создании объекта срабатывает тот конструктор, количество и типы параметров которого совпали с количеством и типами переданных в конструктор аргументов.
В Python создать несколько методов __init__() в классе можно, однако «рабочим» останется только последний. Он переопределит ранее определенные. Поэтому в Python в классах используется только один конструктор, а изменчивость количества передаваемых аргументов настраивается через назначение значений по-умолчанию.
Практическая работа. Конструктор и деструктор
Помимо конструктора объектов в языках программирования есть обратный ему метод – деструктор. Он вызывается, когда объект не создается, а уничтожается.
В языке программирования Python объект уничтожается, когда исчезают все связанные с ним переменные или им присваивается другое значение, в результате чего связь со старым объектом теряется. Удалить переменную можно с помощью команды языка del.
В классах Python функцию деструктора выполняет метод __del__().
Напишите программу по следующему описанию:
Есть класс Person, конструктор которого принимает три параметра (не учитывая self) – имя, фамилию и квалификацию специалиста. Квалификация имеет значение заданное по умолчанию, равное единице.
У класса Person есть метод, который возвращает строку, включающую в себя всю информацию о сотруднике.
Класс Person содержит деструктор, который выводит на экран фразу «До свидания, мистер …» (вместо троеточия должны выводиться имя и фамилия объекта).
В основной ветке программы создайте три объекта класса Person. Посмотрите информацию о сотрудниках и увольте самое слабое звено.
В конце программы добавьте функцию input(), чтобы скрипт не завершился сам, пока не будет нажат Enter. Иначе вы сразу увидите как удаляются все объекты при завершении работы программы.
В Python деструктор используется редко, так как интерпретатор и без него хорошо убирает «мусор».
Курс с примерами решений практических работ:
android-приложение, pdf-версия
С. Шапошникова © 2021
Объектно-ориентированное программирование на Python
Источник
Файл __init__ не работает должным образом в python
У меня есть несколько папок и .py файлов в следующей структуре:
В файле __init__ в папке parent у меня есть import code , а в code у меня есть import subcode . Но когда я попробовал import code.subcode , я получил такую ошибку:
Но когда я просто import code , ошибка не возникает. Однако, когда я вызываю code.subcode , эта ошибка происходит:
Я попробую все упомянутые выше в test.ipynb , который находится в корне каталога.
Знаете ли вы, в чем причина и как я могу это исправить? Спасибо!
Проблема заключается в том, что вы импортируете другой модуль с именем code , который установлен в вашей системе, а не ваш собственный модуль. Вы можете проверить это, проверив путь к файлу модуля в code.__file__ после import code .
Первое, что нужно сделать, это изменить имя вашего модуля, чтобы избежать конфликтов пространства имен с другим пакетом code в вашей системе. Если ваше новое имя пакета не сталкивается с чем-то другим, вы должны либо успешно импортировать его, либо вести себя так, как ожидалось, или полностью не импортировать.
Если он невозможен, это, скорее всего, потому, что ваш каталог parent не находится в переменной среды PYTHONPATH .
Также потенциально могут быть и другие технические причины, по которым модуль не распознается интерпретатором, например, старые кешированные определения (в этом случае достаточно часто перезапускать интерпретатор. Возможно, после удаления любых предварительно скомпилированных версий модуля). Другая проблема, которую я видел, в конечном итоге заключалась в том, что в модуле содержалась ошибка, из-за которой интерпретатор не смог его разобрать. Я уверен, что есть другие нечетные возможности.
Вы находитесь на Python 3. Вам необходимо явно выполнять относительные импортные операции:
Модуль code , который вы сейчас получаете, является стандартной библиотекой code .
Источник
Pygame.init() not working [duplicate]
I downloaded pygame successfully but now when I do:
it gives errors:
And nothing is working for me. Please help me use init and display .
- python 3.4.1 and
- pygame 1.9.2 on
- Windows 7 32bit and
I installed pygame on
3 Answers 3
You probably had named your file pygame.py
when you type:
python won’t import pygame module you want, instead it will try import local module pygame — your file. and your file hasn’t method init. try change file name from pygame.py to mypygame.py.
I had the same problem, but then I reinstalled everything and realized that I had a different version of pygame than I needed for python
I realized also that I shouldn’t use the .zip archive to install. I looked in there and saw that there’s an installer for it if you’re on any major OS. For example, for Macintosh, there’s .dmg files. For Windows, there’s .msi, etc.
You probably installed your pygame library in the include/ folder, but somehow didn’t have the correct files inside it. This may of happened because of some downloading issues or the website you were downloading from. Hope this helps! You want to type downloading pygame from pygame.org instead of some other places on the web because of possible errors or changes in code.
Not the answer you’re looking for? Browse other questions tagged python pygame init or ask your own question.
Linked
Related
Hot Network Questions
site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.10.19.40496
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Источник