Классы, объекты, методы
- Класс - это прототип объекта, в котором описаны все его свойства и методы;
- Объект - это конкретный экземпляр данного класса;
- Методы - это функции конкретного класса;
- Конструктор - это метод (функция), вызываемая при создании объекта. Передает значения аргументов свойствам создаваемого объекта.
Описание класса
class ClassName:
Создание объекта
ObjectName = ClassName()
Описание метода
def name (self, param1, param2, param2):К параметрах метода обязательно должен быть self, это ссылка на текущих экземпляр класса, который передается при вызове метода, то есть это ключевое слово, отсылающее на сам класс.
Описание конструктора
def __init__ (self, param1, param2, param2):К параметрах метода обязательно должен быть self, это ссылка на текущих экземпляр класса, который передается при вызове метода, то есть это ключевое слово, отсылающее на сам класс.
Примеры
class Human:
def __init__ (self, gender, name, age, height, weight):
self.gender = gender
self.name = name
self.age = age
self.height = height
self.weight = weight
A = Human('male', 'A', 25, 176, 67)class Human:
def __init__ (self, gender, name, age = 25, height, weight = None):
self.gender = gender
self.name = name
self.age = age
self.height = height
self.weight = weight
A = Human('male', 'A', 35, 176)Атрибуты
Атрибуты могут быть не только принадлежащими конкретному объекту, но и принадлежащими классу, например
class Human:
human_count = 0
def __init__ (self, gender, name, age, height, weight):
self.gender = gender
self.name = name
self.age = age
self.height = height
self.weight = weight
Human.human_count += 1
При создании объекта значение human_count увеличится. Доступ к атрибуту можно получить как и внутри класса так и снаружи.A = Human('male', 'Tom', 25, 176, 67)
print(vars(A))
Будет выведено
{'gender': 'male', 'name': 'Tom', 'age': 25, 'height': 176, 'weight': 67}A = Human('male', 'Tom', 25, 176, 67)
print(dir(A))
Будет выведено
[__class__, __init__, 'gender', 'name', 'age, 'height, 'weight', 'human_count']
Наследование
Наследование - повторное использование компонентов класса-родителя классом-потомком. Потомкам становятся доступны атрибуты и методы родительского класса. Чтобы инициализировать значения, которые есть в родительском классе, нужно обратиться к нему через super(), при этом выполняется конструктор родительского класса.
class Worker(Human): # Worker наследуется от Human
def __init__ (self, gender, name, age, height, weight, company, position, income):
super().__init__ (gender, name, age, height, weight)
self.company = company
self.position = position
self.income = income
def work(self):
print('I am worker')
Дочерний класс может использовать методы родительского, например
Tom = Worker('male', 'Tom', 25, 176, 67, 'Microsoft', 'Programmer', 1000)
Tom.work()
Tom.say()Инкапсуляция
Инкапсуляция - ограничение доступа к элементам объекта (сокрытие элементов). В Python нет инкапсуляции на уровне языка, она действует на уровне соглашения между программистами. Есть два варианта: одно или два подчеркивания перед название переменной или метода. Если стоит одно подчеркивание это говорит другим программистам не использовать этот элемент, но они все равно смогут это использовать.
Tom._Human__ secret Tom._Human__say()
Полиморфизм
Полиморфизм - разное поведение одного и того же метода в разных классах. В python нет возможности определить несколько методов с одинаковым именем, но с разными аргументами в одном классе.
Перегрузка операторов - в дочерних классах можно можно задать свою реализацию какого-либо метода.
Tom._Human__ secret x.__eq__(y) # сравнение
staticmethod и classmethod
В классе могут присутствовать методы с предопределенными декораторами.
@staticmethod - обозначает обычную функцию, определенную внутри класса, не привязанная к данным конкретного объекта. Статические методы не знают о состоянии текущего экземпляра. Помогают в достижении инкапсуляции в классе.
class Human:
human_count = 0
def __init__ (self, gender, name, age, height, weight):
self.gender = gender
self.name = name
self.age = age
self.height = height
self.weight = weight
Human.human_count += 1
@staticmethod
def is_adult(age):
adult = True if age >= 18 else False
return print('Сотрудник совершеннолетний?', adult)
# Можно вызывать как по названию класса так и по названию экземпляра
Human.is_adult(Tom.age)
Tom.is_adult(18)class Human:
human_count = 0
def __init__ (self, gender, name, age, height, weight):
self.gender = gender
self.name = name
self.age = age
self.height = height
self.weight = weight
Human.human_count += 1
@classmethod
def get_human_count(cls):
print('всего сотрудников', cls.human_count)
# Вызов метода осуществляется через имя класса
Human.get_human_count()