Терминология в Классах Python
Я запутался в формулировках в классах Python, может у кого то есть картинка объясняющая разницу?
В классах в Python есть:
Переменные - которые называются атрибутами или же свойствами класса. Функции - которые называются методами. Экземпляры (они же обьекты) - это что? Тоже переменные? Поля класса - это свойство, или же просто атрибут. Поле класса так же является переменной? Члены класса - атрибут. Тоже переменная?
Мешанина этих слов создает кашу в голове и непонимание. Помогите разобраться.
Ответы (3 шт):
class Students:
"""
Переменная класса, которая привязана не к отдельному экземпляру, а ко всему классу
"""
students_count = 0
def __init__(self, name, surname):
"""
Конструктор класса с 2 параметрами name, surname, с помощью конструктора создаётся экземпляр класса
:param name: имя
:param surname: фамилия
"""
self.name = name # поле (переменная) класса
self.surname = surname # поле класса
Students.students_count += 1
def display_students_count(self):
"""
Метод для вывода кол-во студентов
"""
print('Всего студентов: ', Students.students_count)
def display_student(self):
"""
Вывод текущего студента
"""
print('Имя: {} Фамилия: {}'.format(self.name, self.surname))
"""
Экземпляр класса (Объект) - отдельны представитель класса.
Соответственно student1 = Students("Василий","Пупкин"), будет являться экземпляром класса Students
"""
student1 = Students("Василий", "Пупкин")
"""
Доступ к атрибутам класса осуществляется через .
"""
student1.display_student() # Вывод информации о текущем студенте (экземпляре класса)
student1.display_students_count() # Вывод информации об общем кол-во студентов
Ознакомьтесь
Картинки, к сожалению, нет. К тому же, сдаётся мне, что, прочитав раздел ООП в какой-нибудь книжке по Python, Вы с этим разберётесь, но всё же оставлю здесь своё субъективное понимание представленных терминов.
- Начать лучше, думаю, с объектов (экземпляров). Поясню на примере. Класс – это тип. Пусть у нас есть класс "Компьютер". Тогда объектами этого класса будут "мой компьютер", "Ваш компьютер", "Вон тот комп, что мне понравился в магазине". То есть, некоторые конкретные представители данного класса. Или же есть класс "Человек". Объектами будут Вася, Петя, Коля и т.д. Если перейти к Python:
# Тот же класс человека (пока без реализации)
class Human: # Это класс
...
Vanya = Human() # Vanya – объект класса.
- Атрибуты, свойства, поля класса – это плюс/минус одно и то же (Возможно кто-то пояснит тонкие различия, но, это всё-таки моё видение, а я вижу их как одно и то же, по крайней мере если брать среднее для всех языков. В некоторых Свойство – это нечто отдельное). Это переменная, существующая внутри объекта этого класса и содержащая в себе значение, отражающее некоторое свойство этого объекта. Если вернуться к нашему примеру, атрибуты класса "Человек" это, например, возраст, рост, пол, фамилия и т.д. Если к коду:
class Human:
def __init__(self, age, gender, height):
self.age = age
self.gender = gender
self.height = height
Vanya = Human(20, 'male', 180) # Это Ваня, ему 20, он мужчина, рост 180
Yulya = Human(17, 'female', 160) # Это Юля, ей 17, она девушка, рост 160
print(Vanya.age) # Сколько лет Ване? Выведет 20
print(Yulya.height) # Какого роста Юля? Выведет 160
(в Python, в отличие от C++, например, атрибуты обычно не объявляются заранее (хотя я не эксперт в Python, могу ошибаться), а просто вводятся как переменные с self. в конструкторе или другом методе).
- Ну и про методы: методы (функции-члены) класса – это функции, описывающие, что умеют делать объекты класса. Чтобы сильно не растекаться мыслию, добавлю в пример только один метод – взрослеть. На нужное кол-во лет. Собственно, к коду:
class Human:
def __init__(self, age, gender, height):
self.age = age
self.gender = gender
self.height = height
def grow_up(self, extra_age):
self.age += extra age # Сюда бы проверку на положительность возраста, но мне лень
Vanya = Human(20, 'male', 180) # Это Ваня, ему 20, он мужчина, рост 180
Yulya = Human(17, 'female', 160) # Это Юля, ей 17, она девушка, рост 160
Vanya.grow_up(1) # Ваня повзрослел на год
Yulya.grow_up(2) # Юля повзрослела на 2 (она на севере, в космосе или где там ещё год за два)
print(Vanya.age) # Сколько лет Ване? Уже 21. Выведет 21
P.S. Во-первых, надеюсь не обидел носителей имён, представленных в качестве примера. Если вдруг, извините, я не хотел :) Во-вторых, надеюсь, понятно объяснил. Повторюсь, что это моё субъективное мнение, не претендующее на абсолютную истину. Исправления и уточнения приветствуются в комментариях.
P.P.S. И да, найдите что-нибудь хорошее про ООП из литературы. Не знаю насчёт Python, но Фленов в своей "Библии С#" достаточно понятно и забавно описал все принципы и термины, которые Вас интересуют. В любом случае, квалифицированный автор книги расскажет подробнее и понятнее.
Ответ выше от @Denis довольно показательный. Добавлю только некоторые уточнения. Дело в том, что в разных коммьюнити (разных ЯП) - имеются синонимы фактически. Поэтому возникает иногда путаница, но опытный программист всегда поймет о чем речь.
А теперь поточнее:
- Полем класса называется переменная, связанная с классом или объектом. Синонимы - атрибут класса, переменная член-класса.
- Свойство — это способ доступа к внутреннему состоянию объекта, имитирующий поле. Обращение к свойству объекта выглядит так же, как и обращение к полю, но реализовано через вызов функции.
- В ООП, у класса есть атрибуты - это то же самое, что и переменные, только внутри класса. А также есть методы - это то же самое, что и функции, только внутри класса.
Постарался изложить кратко. В интернетах полно информации об этом.