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

Автор: | 15.11.2016

Объектно-ориентированное программирование (ООП) — возможность языков программирования, в которой пользователь может создавать шаблоны программ (классы) и их копии (объекты).

Класс — тип, описывающий устройство объектов.

Объект — это экземпляр класса. Класс можно сравнить с шаблоном по которому создаются объекты.

Пример простого класса со свойствами:

Для создания класса мы должны использовать конструкцию class.

class human:

Класс может содержать переменные — Свойства класса.

class human:
    name='Имя не задано'
    age=0
    gender='Пол не задан'

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

obj1=human()

Для обращения к свойствам класса мы должны использовать точку.

obj1.name='Вася'
obj1.age=10

Полный код примера программы содержащей наш первый класса и объекты.

class human:
    name='Имя не задано'
    age=0
    gender='Пол не задан'

obj1=human()
obj2=human()
obj1.name='Вася'
obj1.age=10
obj2.name='Коля'
obj2.age=11
print(obj1.name)
print(obj1.age)
print(obj2.name)
print(obj2.age)

В результате выполнения программы мы распечатаем значения свойств объекта.

Конструктор класса.

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

Пример кода:

class human:
    name='Имя не задано'
    age=0
    gender='Пол не задан'
    
    def __init__ (self, name,age):
        self.name = name
        self.age = age

Давайте протестируем наш класс.

class human:
    name='Имя не задано'
    age=0
    gender='Пол не задан'

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

obj1=human('Вася',10)
obj2=human('Коля',10)
print(obj1.name)
print(obj1.age)
print(obj2.name)
print(obj2.age)



Используя конструктор мы значительно упростили инициализацию свойств объекта.

obj1=human('Вася',10)
obj2=human('Коля',10)

 

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

Давайте добавим метод print который распечатает наш класс.

class human:
    name='Имя не задано'
    age=0
    gender='Пол не задан'

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

obj1=human('Вася',10)
obj2=human('Коля',10)
obj1.print()
obj2.print()

Теперь наша программа составляет всего 4-и строчки.

obj1=human('Вася',10)
obj2=human('Коля',10)
obj1.print()
obj2.print()

Задание:

  1. Создать класс компьютер.
  2. Создать в нем свойства отвечающие за параметры компьютера. (Операционная система, тип процессора, память, жесткий диск)
  3. Создать конструктор класса
  4. Создать метод вывода на экран.
  5. Создать 3-и объекта класса.
  6. Инициализировать их.
  7. Вывести на экран используя метод print.

Инкапсуляция и доступ к свойствам
Инкапсуляция является одним из ключевых понятий ООП. Инкапсуляция это механизм защиты внутренних переменных класса. К примеру нам нужно задать возраст человека в диапазоне от 18 до 65 лет. В остальных случая нужно сообщить об ошибке. Для этого нам понадобится инкапсуляция.

Для объявления защищенной или приватной переменной мы должны в начале переменой поставить два нижних подчеркивания

__x

далее определить свойство через которое мы будем получать доступ к нашей защищенной переменной

x = property(getx, setx, delx, «Свойство x»)

и описать методы set get del как указано в примере ниже.

class A:
    err='ok'
    __x=18
    def __init__(self, x):
        self.setx(x)

    def getx(self):  # метод для получения значения
        return self.__x

    def setx(self, value):  # присваивания нового значения
        if value >= 18 and value <= 65:
            self.__x = value
            self.err = 'ok'
        else:
            self.err = 'ошибка'

    def delx(self):  # удаления атрибута
        del self.__x

    x = property(getx, setx, delx, "Свойство x")  # определяем x как свойство

    def print(self):
        if self.err == 'ok':
            print(self.x)
        else:
            print(self.err)


a = A(5)
a.print()  # Синтаксис доступа к атрибуту при этом прежний
a.x = 18

a.print()  # Синтаксис доступа к атрибуту при этом прежний