Python Урок 10

## Классы и объекты

Python является объектно-ориентрованным языком программирования — это парадигма программирования основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса.

В объектно-ориентрованном программировании, вы пишите классы которые описывают реально существующие признаки и свойства. Уже после мы создаем какие-то объекты на основе этих описаний.

По сути, по описанию класса определяется общее поведения для какой-то целой категории объектов. Классы нам позволяют классифицировать и группировать объекты по каким-то признакам и свойствам.

## Классы

### Работа с классами

Всегда комментируйте класс — это документирование класса.

```
class house():
    """Описание дома""" *# Документация класса.*

```

### Методы

Описание класса состоит из методов. Метод говорит, что будет делать наш класс и мы можем занести свойство класса.

### Метод init

Метод init — это специальный метод, который автоматически выполняется при создании нового экземпляра, на базе нашего класса. Внутри метода пишем свойство self нашего объекта на основе класса.

```
class house():
    """Описание дома""" *# Документация класса.*
    def \_\_init\_\_(self):

```

### Аргумент self

Теперь указываем свойство в этом классе, какие будут объекты. Параметр self обязателен при определении методов. Он предшествует всем остальным параметрам. Он должен быть включен для того, чтобы в будущем, когда вызываться метод init/инициализация, ему передавался аргумент self.

Аргумент self — это ссылка на сам экземпляр, на сам конкретный объект на основе класса.

```
class house():
    """Описание дома""" *# Документация класса.*
    def \_\_init\_\_(self, street, number):

```

Создаем класс до конца.

```
class house():
    """Описание дома""" *# Документация класса.*
    def \_\_init\_\_(self, street, number):
        self.street = street
        self.number = number
        """Свойство дома улица и номер"""

    def build(self):
        """Строит дом"""
        print("Дом на улице " + self.street + " под номером " + self.number + " построен.")

```

## Объект

### Работа с объектом

Теперь на основе класса создадим объект. Каждый объект является экземпляром класса. Создание объекта на основе класса называется экземпляром.

Создадим объект hosuse1, присвойте класс house и передайте в качестве параметров, те аргументы, которые отвечают за свойство нашего дома.

```
**Здесь должен быть класс, который мы написали выше ↑↑↑.**

house1 = house("Московская", 12)
house2 = house("Московская", 24)

```

Теперь вы можете обратиться к каждому свойству, это преимущество объектно-ориентированного программирования. Вы можете обратиться к каждому свойству или методу нашего объекта.

Например на какой улице находиться hause1:

```
**Здесь должен быть класс, который мы написали выше ↑↑↑.**

house1 = house("Московская", 12)
house2 = house("Московская", 24)

print(house1.street)

```

Обращение к методам, которые у вас описаны в классе:

```
class house():
    """Описание дома""" *# Документация класса.*
    def \_\_init\_\_(self, street, number):
        self.street = street
        self.number = number
        """Свойство дома улица и номер"""

    def build(self):
        """Строит дом"""
        print("Дом на улице " + self.street + " под номером " + str(self.number) + " построен.") *# Измените номер, потому что номер это число, а нам нужно вывести строку/текст.*

house1 = house("Московская", 12)
house2 = house("Московская", 24)

house1.build() *# Выводит build/строительство дома.*

```

## Назначение атрибутов значения по умолчанию

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

```
class house():
    """Описание дома""" *# Документация класса.*
    def \_\_init\_\_(self, street, number):
        self.street = street
        self.number = number
        self.age = 0 *# Параметр по умолчанию.*
        """Свойство дома улица и номер"""

    def build(self):
        """Строит дом"""
        print("Дом на улице " + self.street + " под номером " + str(self.number) + " построен.")

house1 = house("Московская", 12)
house2 = house("Московская", 24)

print(house1.age)

```

Теперь напишем аргумент, метод который будет определять возраст нашего дома. Пользователь будет вводить год, а метод будет показывать возраст дома

```
class house():
    """Описание дома""" *# Документация класса.*
    def \_\_init\_\_(self, street, number):
        self.street = street
        self.number = number
        self.age = 0 *# Параметр по умолчанию.*
        """Свойство дома улица и номер"""

    def build(self):
        """Строит дом"""
        print("Дом на улице " + self.street + " под номером " + str(self.number) + " построен.")

     def age\_of\_house(self, year):
         """Возраст дома"""
         self.age += year

house1 = house("Московская", 12)
house2 = house("Московская", 24)

house1.age\_of\_house(5)
print(house1.age)

```

## Наследование

Работа над новым классом не обязательно начинается с нуля. Если класс представляет собой, раннею написанную версию специализированного класса, то вы можете воспользоваться наследованием.

1 класс наследующий от другого, автоматически получает все атрибуты 1 класса, но исходный класс от которого вы наследуете, будет называться родителем, а новый класс будет потомком.

Класс который наследует атрибуты и методы родителя, он может определять свои атрибуты и методы или переопределять существующие методы своего родителя.

### Работа с наследованием

Создаем класс. Например: написанный класс будет дома на улице, а дочерний класс будет дома на проспекте.

```
class house():
    """Описание дома""" *# Документация класса.*
    def \_\_init\_\_(self, street, number):
        self.street = street
        self.number = number
        self.age = 0 *# Параметр по умолчанию.*
        """Свойство дома улица и номер"""

    def build(self):
        """Строит дом"""
        print("Дом на улице " + self.street + " под номером " + str(self.number) + " построен.")

     def age\_of\_house(self, year):
         """Возраст дома"""
         self.age += year

```

```
**Здесь должен быть класс, который мы написали выше ↑↑↑.**

class prospecthouse(house): *# Указываем в новом параметре класс от которого мы наследуем.*
    """Дома на проспекте"""
    def \_\_init\_\_(self, prospect, number):

```

Теперь перенесите родительские свойства, которые отвечают за номер дома. Оператор super помогает связать потомка с родителем.

```
**Здесь должен быть класс, который мы написали выше ↑↑↑.**

class prospecthouse(house): *# Указываем в новом параметре класс от которого мы наследуем.*
    """Дома на проспекте"""
    def \_\_init\_\_(self, prospect, number):
        super().\_\_init\_\_(self, number)
        self.prospect = prospect

 *# Оператор super приказывает вызвать init класса являющееся радетелем, sperclass/родитель subclass/потомок.*

ph = prospecthouse("Ленина", 12)
print(ph.prospect)

```