Изучаем Python. №12. Объектно-ориентированное программирование. Основы.


Продолжим изучать язык программирования python. И сегодня коснемся такой важной части, как объектно-ориентированное программирования (далее ООП) на этом замечательном языке.

Для начала восстановим наши знания про область видимости (ОВ).
В каждый момент существует три области видимости:
-Локальная;
-Средняя (глобальные имена модуля);
-Внешняя (Встроенные имена).

Глобальным переменным невозможно прямо присвоить значения внутри функций, хотя ссылки на них могут использоваться.

ПРИНЦИПЫ ООП

-Абстракция.
-Инкапсуляция.
-Полиморфизм.
-Наследование.

Поскольку python ООП язык программирования (ЯП), то это значит, что он построен на следующих принципах:
-Все данные в нем представляются объектами.
-Программу можно составить как набор взаимодействующих объектов, посылающих друг другу сообщения.
-Каждый объект имеет собственную часть памяти и может состоять из других объектов.
-Каждый объект имеет тип.
-Все объекты одного типа могут принимать одни и те же сообщения (выполнять одни и те же действия).

ОПРЕДЕЛЕНИЕ КЛАССА

Class ИмяКласса(Класс1, Класс2): #Классы 1 и 2 - родительские классы
     Выражение1

Пример пустого класса

class A():
    pass

ОБЪЕКТЫ-КЛАССЫ

-Ссылки на атрибуты
-Создание экземпляра
self — аналог this-> — ссылка

Код:
class MyClass():
    attr = 12345
    def foo(self):
        return 'Hello, World'

Решение:
>>> MyClass.attr
12345
>>> MyClass.foo
 # адрес функции

СВЯЗАННЫЙ И НЕСВЯЗАННЫЙ МЕТОДЫ (Bound and Unbound)

Код:
class A():
    def foo(self):
        pass

Решение:
>>> A.foo
<unbound method A.foo>
>>> a=A()
>>> a.foo
<bound method A.foo of <__main__.A instance at 0xb6d2910c>>

ИНИЦИАЛИЗАТОР И ДЕСТРУКТОР

Перед и после по 2 подчеркивания
__init__(self) — Инициализатор
__del__(self) — Деструктор
self — текущий экземпляр класса, аналог this->

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

МЕТОДЫ, ФУНКЦИИ И АТРИБУТЫ

Очень важно в каком порядке давать значения атрибутам

Код:
class admin():
    city = "Dnepr"
    def __init__(self,name,year):
        self.name = name
        self.year = year
    def print_info(self):
        print self.name," исполнилось ",self.year," лет"

Результат:
>>> Vitaliy = admin('Vitaliy',26)
>>> Vitaliy.name
'Vitaliy'
>>> Vitaliy.city
'Dnepr'
>>> Vitaliy.year
26
>>> Vitaliy.girl = 'Oksana' # добавляем значение girl
>>> Vitaliy.girl
'Oksana'
>>> Vitaliy.print_info
<bound method admin.print_info of <__main__.admin instance at 0xb6d2928c>>
>>> Vitaliy.print_info()
Vitaliy  исполнилось  26  лет
>>> admin.city
'Dnepr'
>>> admin.print_info(Vitaliy)
Vitaliy  исполнилось  26  лет
>>> Vitaliy.city = 'Kiev' #  меняем значение города Виталия
>>> Vitaliy.city
'Kiev'
>>> admin.city
'Dnepr' # у админа город не меняется
>>> admin.city = 'Poltava'
>>> admin.city
'Poltava'

PRIVATE AND PUBLIC

По умолчанию все атрибуты и все функции Public. Если мы хотим сделать атрибут Private, то нужно поставить либо не менее двух символов подчеркивания вначале, либо не более одного символа подчеркивания в конце.

    def __am(self):
        print self.name

SEMI PRIVATE

_atribute — атрибут не предназначен для использования вне методов класса, однако атрибут все-таки доступен по этому имени.

СТАТИЧЕСКИЕ ПЕРЕМЕННЫЕ

Код:
class counter():
    count = 0
    def __init__(self):
        self.__class__.count+=1

print counter.count
print "------------------------------"

c = counter()
print c.count, counter.count
print "------------------------------"        

d = counter()
print c.count, d.count, counter.count
print "------------------------------" 

Результат:
0
------------------------------
1 1
------------------------------
2 2 2
------------------------------

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

×