Как добавить класс в pycharm python
Перейти к содержимому

Как добавить класс в pycharm python

Не получается импортировать класс

Дерево каталогов

Привет. У меня есть класс CStatistics , который необходимо импортировать. Данный класс находится по адресу: DataUnloader/Statistic/CStatistics.py Скрипт, в который должен произойти импорт находится по адресу: ./ (на скрине Quality ) Чтобы было понятнее, я прикреплю скрин: Проблема в том, что указанный класс не подцепляется. Логично, что нужно сделать так:

import DataUnloader.Statistic.SStatistics 

Пример импорта в PyCharm

чтобы его подцепить. Но это не помогает Здесь задавался подобный вопрос. Он совпадает с моим мнением. Но это не помогло решить проблему. Подскажите, как сделать импорт? PyCharm , в котором я веду разработку, не хочет даже видеть DataUnloader :

Отслеживать
задан 6 апр 2017 в 11:32
hedgehogues hedgehogues
9,431 8 8 золотых знаков 50 50 серебряных знаков 101 101 бронзовый знак
Эм. У вас в папке лежит «CStatistics» а вы импортируете «SStatistics»
6 апр 2017 в 12:12
@Alban Пардон, в скрине ошибка. Но факт в том, что даже DataUnloader он не видит.
6 апр 2017 в 12:26
@Alban что он сделает?
6 апр 2017 в 12:44

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

во-первых, в PyCharm можно помечать директорию как source root, что позволяет ему видеть директории ниже

во-вторых, я не вижу в Вашей иерархии __init__.py -файлов, они нужны, чтобы Python и PyCharm знали, что это не просто директория, а пакет с модулями, без них импорт не сработает как нужно

Отслеживать
ответ дан 6 апр 2017 в 14:14
Azat Ibrakov Azat Ibrakov
196 6 6 бронзовых знаков

Используйте следующею конструкцию:

import sys sys.path.append(r"/путь/к/каталогу/в/котором/лежит/модуль") import name # Где name название модуля в этом каталоге 

К примеру есть python файл в который вам необходимо импортировать модуль под названием My_class .

Python file лежит на рабочем столе. Модуль также на рабочем толе, но по пути: /test/test_2/ и содержит в себе следующее:

def check(): print('Im here!') 
import sys sys.path.append(r"C:\Users\user\Desktop\test\test_2") import My_class My_class.check() # Проверяем 

Видим что всё работает:

Im here! 

Как создать класс в IntelliJ IDEA для элементарной программы

От автора: первый шаг к разработке полномасштабных приложений — это создать класс в IntelliJ IDEA. Ну, а лучше учиться, создавая простейшие программы с помощью кода. Сегодня вместе создадим простую программу «Hello World!». Заодно покажем базовый функционал среды разработки, с которой имеем дело. Работая с нашей пошаговой инструкцией, вы сумеете привыкнуть к интерфейсу и будете ближе к уверенному использованию IDE.

Как создать класс в IntelliJ IDEA для элементарной программы

Стартуем с набора!

Скорее всего, этот шаг вы уже выполнили, и нет нужды опять возвращаться к нему. Но на всякий случай напомним: для работы с IntelliJ IDEA необходимо установка набора разработчика — Java Development Kit. Его можно стянуть с официального сайта Oracle. Кстати, там есть и мануал по установке. Но если вы еще новичок, то в интернете есть более детальные инструкции, вплоть до видеоматериалов.

Первый проект

Итак, допустим, что вы успешно установили JDK. Если же это не получилось с первого раза, не отчаивайтесь: даже лучшие из людей иногда делают ошибки в установке набора разработчика. Просто удалите все, что распаковали на компьютер, откройте инструкцию и пройдите ее еще раз. Все заработает!

Как создать класс в IntelliJ IDEA для элементарной программы

А теперь возвращаемся обратно к IntelliJ IDEA. Если вы читатель статьи, значит, скорее всего, проектов еще не создавали. Пришло время первого — кликните по значку среды и нажмите кнопку Create New Project. Если на данном этапе что-то пошло не так, то в 9 из 10 случаев проблема с JDK. Он либо не установлен, либо его не видит система. Устранить данную проблему можно, оперируя в переменных средах. Решение есть в сети.

Сначала вы не получите доступ непосредственно к проекту. Для начала, зададим исходные данные в мастере создания. Так как пишем на Java без «примесей», то нашим выбором в правом окне станет Java Module. Ну, а далее указываем название. Назовите его «first» и оставьте на память.

И вот, снова сталкиваемся с JDK. Он установлен, система его видит, но нужно провести настройку. Для этого выбираем в подменю JDK из Project SDK и жмем на кнопку New. Таким образом, переходим в новое меню, где нужно выбрать папку с установленным Java Development Kit — вы же помните, куда его установили?

Получили подтверждение об установленном JDK и нажимаем Next. Внимательно подходите к настройке. От того, к какой версии набора вы подключите среду разработки, зависит структура не только этого, но и всех последующих проектов. Java-модули будут подключаться к этому набору.

Теперь нам нужно указать, какие технологии подключим к проекту. Но, так как наше приложение будет простым и незамысловатым, нам нужен только один инструмент — язык Java. Ну и остальной софт, который позволяет к нему обращаться. Немного ждем создания структуры проекта и идем создавать программу дальше.

Теперь перейдем во вкладку Project и увидим, какую структуру имеет наш проект:

First. Так было названо наше приложение и такое название носит Java-модуль. Так же называется и узел, в котором хранятся все необходимые файлы:

.idea. Здесь хранятся все файлы конфигурации проекта, обеспечивающие то, что на другой IntelliJ вы откроете этот проект с такими же настройками;

src — содержит исходный код, который вы и напишете;

External Libraries. Здесь обычно хранятся все необходимые внешние инструменты, на которых построено приложение. Но, так как наша программа весьма проста, то к ней подключены только файлы .jar, которые были взяты из Java Development Kit.

Все в класс

Вернее, в пакет для класса. Необходимо для начала назвать его: com.sample.first звучит неплохо. Теперь работаем по инструкции.

Открываем окно инструментов Project и выбираем директорию src, в которой у нас хранится исходный код, а потом жмем Alt+Insert.

В меню под названием New выбираем Package.

Там, где открылось окно, теперь нужно ввести название пакета. Теперь в каталоге src у нас есть новый пакет, который видно в окне Project.

И, наконец, создадим новый класс. Кликаем по названию пакета, выбираем Java Class. Появляется окно для названия, и вводим его — на ваше усмотрение. Класс появился в структуре. Таким образом, поставленная на сегодня задача выполнена. Бывают и случаи, когда класс не создается, либо IntelliJ IDEA не видит классы. Но это тема для отдельной статьи.

Объектно-ориентированное программирование

Python имеет множество встроенных типов, например, int, str и так далее, которые мы можем использовать в программе. Но также Python позволяет определять собственные типы с помощью классов . Класс представляет некоторую сущность. Конкретным воплощением класса является объект.

Можно еще провести следующую аналогию. У нас у всех есть некоторое представление о человеке, у которого есть имя, возраст, какие-то другие характеристики Человек может выполнять некоторые действия — ходить, бегать, думать и т.д. То есть это представление, которое включает набор характеристик и действий, можно назвать классом. Конкретное воплощение этого шаблона может отличаться, например, одни люди имеют одно имя, другие — другое имя. И реально существующий человек будет представлять объект этого класса.

Класс определяется с помощью ключевого слова class :

class название_класса: атрибуты_класса методы_класса

Внутри класса определяются его атрибуты, которые хранят различные характеристики класса, и методы — функции класса.

Создадим простейший класс:

class Person: pass

В данном случае определен класс Person, который условно представляет человека. В данном случае в классе не определяется никаких методов или атрибутов. Однако поскольку в нем должно быть что-то определено, то в качестве заменителя функционала класса применяется оператор pass . Этот оператор применяется, когда синтаксически необходимо определить некоторый код, однако мы не хотим его, и вместо конкретного кода вставляем оператор pass.

После создания класса можно определить объекты этого класса. Например:

class Person: pass tom = Person() # определение объекта tom bob = Person() # определение объекта bob

После определения класса Person создаются два объекта класса Person — tom и bob. Для создания объекта применяется специальная функция — конструктор , которая называется по имени класса и которая возвращает объект класса. То есть в данном случае вызов Person() представляет вызов конструктора. Каждый класс по умолчанию имеет конструктор без параметров:

tom = Person() # Person() - вызов конструктора, который возвращает объект класса Person

Методы классов

Методы класса фактически представляют функции, которые определенны внутри класса и которые определяют его поведение. Например, определим класс Person с одним методом:

class Person: # определение класса Person def say_hello(self): print("Hello") tom = Person() tom.say_hello() # Hello

Здесь определен метод say_hello() , который условно выполняет приветствие — выводит строку на консоль. При определении методов любого класса следует учитывать, что все они должны принимать в качестве первого параметра ссылку на текущий объект, который согласно условностям называется self . Через эту ссылку внутри класса мы можем обратиться к функциональности текущего объекта. Но при самом вызове метода этот параметр не учитывается.

Используя имя объекта, мы можем обратиться к его методам. Для обращения к методам применяется нотация точки — после имени объекта ставится точка и после нее идет вызов метода:

объект.метод([параметры метода])

Например, обращение к методу say_hello() для вывода приветствия на консоль:

tom.say_hello() # Hello

В итоге данная программа выведет на консоль строку «Hello».

Если метод должен принимать другие параметры, то они определяются после параметра self , и при вызове подобного метода для них необходимо передать значения:

class Person: # определение класса Person def say(self, message): # метод print(message) tom = Person() tom.say("Hello METANIT.COM") # Hello METANIT.COM

Здесь определен метод say() . Он принимает два параметра: self и message. И для второго параметра — message при вызове метода необходимо передать значение.

self

Через ключевое слово self можно обращаться внутри класса к функциональности текущего объекта:

self.атрибут # обращение к атрибуту self.метод # обращение к методу

Например, определим два метода в классе Person:

class Person: def say(self, message): print(message) def say_hello(self): self.say("Hello work") # обращаемся к выше определенному методу say tom = Person() tom.say_hello() # Hello work

Здесь в одном методе — say_hello() вызывается другой метод — say() :

self.say("Hello work")

Поскольку метод say() принимает кроме self еще параметры (параметр message), то при вызове метода для этого параметра передается значение.

Причем при вызове метода объекта нам обязательно необходимо использовать слово self , если мы его не используем:

def say_hello(self): say("Hello work") # ! Ошибка

То мы столкнемся с ошибкой

Конструкторы

Для создания объекта класса используется конструктор. Так, выше когда мы создавали объекты класса Person, мы использовали конструктор по умолчанию, который не принимает параметров и который неявно имеют все классы:

tom = Person()

Однако мы можем явным образом определить в классах конструктор с помощью специального метода, который называется __init__() (по два прочерка с каждой стороны). К примеру, изменим класс Person, добавив в него конструктор:

class Person: # конструктор def __init__(self): print("Создание объекта Person") def say_hello(self): print("Hello") tom = Person() # Создание объекта Person tom.say_hello() # Hello

Итак, здесь в коде класса Person определен конструктор и метод say_hello() . В качестве первого параметра конструктор, как и методы, также принимает ссылку на текущий объект — self. Обычно конструкторы применяются для определения действий, которые должны производиться при создании объекта.

Теперь при создании объекта:

tom = Person()

будет производится вызов конструктора __init__() из класса Person, который выведет на консоль строку «Создание объекта Person».

Атрибуты объекта

Атрибуты хранят состояние объекта. Для определения и установки атрибутов внутри класса можно применять слово self . Например, определим следующий класс Person:

class Person: def __init__(self, name): self.name = name # имя человека self.age = 1 # возраст человека tom = Person("Tom") # обращение к атрибутам # получение значений print(tom.name) # Tom print(tom.age) # 1 # изменение значения tom.age = 37 print(tom.age) # 37

Теперь конструктор класса Person принимает еще один параметр — name. Через этот параметр в конструктор будет передаваться имя создаваемого человека.

Внутри конструктора устанавливаются два атрибута — name и age (условно имя и возраст человека):

def __init__(self, name): self.name = name self.age = 1

Атрибуту self.name присваивается значение переменной name. Атрибут age получает значение 1.

Если мы определили в классе конструктор __init__, мы уже не сможем вызвать конструктор по умолчанию. Теперь нам надо вызывать наш явным образом опреледеленный конструктор __init__, в который необходимо передать значение для параметра name:

tom = Person("Tom")

Далее по имени объекта мы можем обращаться к атрибутам объекта — получать и изменять их значения:

print(tom.name) # получение значения атрибута name tom.age = 37 # изменение значения атрибута age

В принципе нам необязательно определять атрибуты внутри класса — Python позволяет сделать это динамически вне кода:

class Person: def __init__(self, name): self.name = name # имя человека self.age = 1 # возраст человека tom = Person("Tom") tom.company = "Microsoft" print(tom.company) # Microsoft

Здесь динамически устанавливается атрибут company, который хранит место работы человека. И после установки мы также можем получить его значение. В то же время подобное определение чревато ошибками. Например, если мы попытаемся обратиться к атрибуту до его определения, то программа сгенерирует ошибку:

tom = Person("Tom") print(tom.company) # ! Ошибка - AttributeError: Person object has no attribute company

Для обращения к атрибутам объекта внутри класса в его методах также применяется слово self:

class Person: def __init__(self, name): self.name = name # имя человека self.age = 1 # возраст человека def display_info(self): print(f"Name: Age: ") tom = Person("Tom") tom.display_info() # Name: Tom Age: 1

Здесь определяется метод display_info(), который выводит информацию на консоль. И для обращения в методе к атрибутам объекта применяется слово self: self.name и self.age

Создание объектов

Выше создавался один объект. Но подобным образом можно создавать и другие объекты класса:

class Person: def __init__(self, name): self.name = name # имя человека self.age = 1 # возраст человека def display_info(self): print(f"Name: Age: ") tom = Person("Tom") tom.age = 37 tom.display_info() # Name: Tom Age: 37 bob = Person("Bob") bob.age = 41 bob.display_info() # Name: Bob Age: 41

Здесь создаются два объекта класса Person: tom и bob. Они соответствуют определению класса Person, имеют одинаковый набор атрибутов и методов, однако их состояние будет отличаться.

При выполнении программы Python динамически будет определять self — он представляет объект, у которого вызывается метод. Например, в строке:

tom.display_info() # Name: Tom Age: 37

Это будет объект tom

bob.display_info()

Это будет объект bob

В итоге мы получим следующий консольный вывод:

Name: Tom Age: 37 Name: Bob Age: 41

Конструктор класса – метод __init__

В объектно-ориентированном программировании конструктором класса называют метод, который автоматически вызывается при создании объектов. Его также можно назвать конструктором объектов класса. Имя такого метода обычно регламентируется синтаксисом конкретного языка программирования. Так в Java имя конструктора класса совпадает с именем самого класса. В Python же роль конструктора играет метод __init__ .

В Python наличие пар знаков подчеркивания спереди и сзади в имени метода говорит о том, что он принадлежит к группе методов перегрузки операторов. Если подобные методы определены в классе, то объекты могут участвовать в таких операциях как сложение, вычитание, вызываться как функции и др.

При этом методы перегрузки операторов не надо вызывать по имени. Вызовом для них является сам факт участия объекта в определенной операции. В случае конструктора класса – это операция создания объекта. Так как объект создается в момент вызова класса по имени, то в этот момент вызывается метод __init__ .

Необходимость конструкторов связана с тем, что нередко объекты должны иметь собственные свойства сразу. Пусть имеется класс Person , объекты которого обязательно должны иметь имя и фамилию. Если класс будет описан подобным образом

class Person: def set_name(self, n, s): self.name = n self.surname = s

то создание объекта возможно без полей. Для установки имени и фамилии метод set_name нужно вызывать отдельно:

>>> from test import Person >>> p1 = Person() >>> p1.set_name("Bill", "Ross") >>> p1.name, p1.surname ('Bill', 'Ross')

В свою очередь, конструктор класса не позволит создать объект без обязательных полей:

class Person: def __init__(self, n, s): self.name = n self.surname = s p1 = Person("Sam", "Baker") print(p1.name, p1.surname)

Здесь при вызове класса в круглых скобках передаются значения, которые будут присвоены параметрам метода __init__ . Первый его параметр – self – ссылка на сам только что созданный объект.

Теперь, если мы попытаемся создать объект, не передав ничего в конструктор, то будет возбуждено исключение, и объект не будет создан:

>>> p1 = Person() Traceback (most recent call last): File "", line 1, in TypeError: __init__() missing 2 required positional arguments: 'n' and 's'

Однако бывает, что надо допустить создание объекта, даже если никакие данные в конструктор не передаются. В таком случае параметрам конструктора класса задаются значения по умолчанию:

class Rectangle: def __init__(self, w=0.5, h=1): self.width = w self.height = h def square(self): return self.width * self.height rec1 = Rectangle(5, 2) rec2 = Rectangle() rec3 = Rectangle(3) rec4 = Rectangle(h=4) print(rec1.square()) print(rec2.square()) print(rec3.square()) print(rec4.square())
10 0.5 3 2.0

Если класс вызывается без значений в скобках, то для параметров будут использованы их значения по умолчанию. Однако поля width и height будут у всех объектов.

Кроме того, конструктору вовсе не обязательно принимать какие-либо параметры, не считая self .

В других языка программирования, например в Java, классы могут содержать несколько конструкторов, которые между собой отличаются количеством параметром, а также, возможно, их типом. При создании объекта срабатывает тот конструктор, количество и типы параметров которого совпали с количеством и типами переданных в конструктор аргументов.

В Python создать несколько методов __init__ в классе можно, однако «рабочим» останется только последний. Он переопределит ранее определенные. Поэтому в Python в классах используется только один конструктор, а изменчивость количества передаваемых аргументов настраивается через назначение значений по-умолчанию.

Практическая работа. Конструктор и деструктор

Помимо конструктора объектов в языках программирования есть обратный ему метод – деструктор. Он вызывается, когда объект не создается, а уничтожается.

Это не значит, что сам деструктор уничтожает объект. В теле самого метода нет никаких инструкций по удалению экземпляра. Непосредственное удаление выполняется автоматически так называемым сборщиком мусора.

Деструктор (финализатор) в коде вашего класса следует использовать, когда при удалении объекта необходимо выполнить ряд сопутствующий действий, например, отправить сообщение, закрыть файл, разорвать соединение с базой данных.

В языке программирования Python объект уничтожается, когда исчезают все связанные с ним переменные или им присваивается другое значение, в результате чего связь со старым объектом теряется. Удалить переменную можно с помощью команды языка del . Также все объекты уничтожаются, когда программа завершает свою работу.

В классах Python функцию деструктора выполняет метод __del__ .

Напишите программу по следующему описанию:

  1. Есть класс Person , конструктор которого принимает три параметра (не учитывая self ) – имя, фамилию и квалификацию специалиста. Квалификация имеет значение заданное по умолчанию, равное единице.
  2. У класса Person есть метод, который возвращает строку, включающую в себя всю информацию о сотруднике.
  3. Класс Person содержит деструктор, который выводит на экран фразу «До свидания, мистер …» (вместо троеточия должны выводиться имя и фамилия объекта).
  4. В основной ветке программы создайте три объекта класса Person . Посмотрите информацию о сотрудниках и увольте самое слабое звено.
  5. В конце программы добавьте функцию input() , чтобы скрипт не завершился сам, пока не будет нажат Enter . Иначе вы сразу увидите как удаляются все объекты при завершении работы программы.

Курс с примерами решений практических работ:
pdf-версия

X Скрыть Наверх

Объектно-ориентированное программирование на Python

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *