Быстрый в изучении - мощный в программировании
Скрипт ИНВЕСТОР на Python

Попробуйте себя в качестве инвестора имея в помощники мощный алгоритм советника на Python...

Все уроки по PyQt5

PyQt5 реализован как комплект Python-модулей. Он включает в себя около 620 классов и 6000 функций и методов...

Скрипт отправки SMS через Python

Была задача отправить SMS-ки большому списку номеров телефона с уточнением цены за всю рассылку "До" ее отправки...

ооп python

Свойства класса Python

Классы нового стиля позволяют создать идентификатор, через который можно получить, изменить или удалить значение атрибута класса. Создается такой идентификатор с помощью функции property(), форма функции:

<Свойства> = property(<Чтение>[, <Запись>[, <Удаление>[, <Строка документирования>]]])

В первых трех параметрах указывается ссылка на соответствующий метод класса. При попытке получить значение будет вызван метод, указанный в первом параметре. При операции присваивания значения будет вызван метод, указанный во втором параметре. Этот метод должен принимать один параметр. В случае удаления атрибута вызывается метод, указанный в третьем параметре. Если в качестве какого-либо параметра задано значение None, то это означает, что соответствующий метод не поддерживается. Рассмотрим свойства класса на примере.

Далее...

Абстрактные методы в Python

Абстрактные методы содержат только определение метода без реализации. Предполагается, что класс-потомок должен переопределить метод и реализовать его функциональность. Чтобы такое предположение сделать более очевидным, часто внутри абстрактного метода возбуждают исключение.

Абстрактные методы

class Class1(object):
    def test(self, x):     # Абстрактный метод
        # Возбуждаем исключение с помощью raise
        raise NotImplementedError("Необходимо переопределить метод")
class Class2(Class1):      # Наследуем абстрактный метод
    def test(self, x):     # Переопределяем метод
        print x
class Class3(Class1):      # Класс не переопределяет метод
    pass
c2 = Class2()
c2.test(50)                # Выведет: 50
c3 = Class3()
try:                       # Перехватываем исключения
    c3.test(50)            # Ошибка. Метод test() не переопределен
except NotImplementedError, msg:
    print msg              # Выведет: Необходимо переопределить метод
Далее...

Статические методы

Внутри класса можно создать метод, который будет доступен без создания экземпляра класса. Для этого перед определением метода внутри класса следует указать декоратор @staticmethod. Вызов статического метода без создания экземпляра класса осуществляется следующим образом:

<Название класса>.<Название метода>(<Параметры>)
Кроме того, можно вызвать статический метод через экземпляр класса:

<Экземпляр класса>.<Название метода>(<Параметры>)
Пример использования статических методов вриведен ниже.

class Class1(object):
    @staticmethod
    def sum1(x, y):              # Статический метод
        return x + y
    def sum2(self, x, y):        # Обычный метод в классе
        return x + y
    def sum3(self, x, y):
        return Class1.sum1(x, y) # Вызов из метода класса
 
print Class1.sum1(10, 20)        # Вызываем статический метод
c1 = Class1()
print c1.sum2(15, 6)             # Вызываем метод класса
print c1.sum1(50, 12)            # Вызываем статический метод
                                 # через экземпляр класса
print c1.sum3(23, 5)             # Вызываем статический метод
                                 # внутри класса
Далее...

Наследование ООП Python

Наследование в Python является важным фактором для понимания принципа работы ООП. Предположим, у вас есть класс (Пример Class1). При помощи наследования мы можем создать новый класс (Например Class2), в котором будет доступ ко всем атрибутам и методам класса Class1, а также к некоторым атрибутам и методам.

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

# -*- coding: utf-8 -*-
class Class1:         # Базовый класс
    def f_func1(self):
        print "Метод f_func1() класса Class1"
 
    def f_func2(self):
        print "Метод f_func2() класса Class1"
 
class Class2(Class1): # Класс Class2 наследует класс Class1
    def f_func3(self):
        print "Метод f_func3() класса Class2"
 
c1 = Class2()         # Создаем экземпляр класса Class2
c1.f_func1()          # Выведет: Метод f_func1() класса Class1
c1.f_func2()          # Выведет: Метод f_func2() класса Class1
c1.f_func3()          # Выведет: Метод f_func3() класса Class2
Как видно из примера, класс Class1 указывается внутри круглых скобок в определение класса Class2. Таким образом, класс Class2 наследует все атрибуты и методы класса Class1. Класс Class1 вызывется базовым классом ими суперклассом, а класс Class2 - производным классом или подклассом.

Далее...

Объектно-ориентированное программирование в python

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

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

Определение класса и создание экземпляра класса в Python

Класс описывается с помощью ключевого слова class по следующей схеме:

class <Название класса>[(<Класс1>[, ..., <КлассN>])]:
    [""" Строка документирования """]
    <Описание атрибута и методов>

Инструкция создает новый объект и присваивает ссылку на него идентификатору, указанному после ключевого слова class. Это означает, что название класса должно полностью соответствовать правилам именований переменных. После названия класса в круглых скобках можно указать один или несколько базовых классов через запятую. Если класс не наследует базовые классы, то круглые скобки можно не указывать. Следует заметить, что все выражения внутри инструкции class выполняются при создании объекта, а не при создании экземпляра класса. В качестве примера создадим класс, внутри которого просто выводится сообщение:

Далее...

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход. Python поддерживает множественное наследование, переопределение инфиксных операторов, причем можно переопределить операцию как для левого операнда, так и для правого; в версии 2.1 есть полное переопределение операторов сравнения (механизм rich comparison для объектов, поддерживающих частичное упорядочивание, например, матриц).

В Python имеются исключения и механизм их перехвата; таким образом программист может построить правильную обработку ошибок и создать надежную программу. Встроенные механизмы интроспекции позволяют опрашивать интерфейсы объектов во время выполнения программы. Например, можно узнать количество и имена параметров функции; эту интроспекцию использует Zope, чтобы подготовить правильный список параметров функции при вызове ее из web.

Из современных языков Python можно сравнить в первую очередь с Java и Perl. Python выполняет все обещания, которые дала, но не выполнила Java. Python очень хорошо переносим. Он работает на всех платформах, на которых есть Java, и еще на многих. Мало найдется таких платформ, на которые Python не перенесен. Я не говорю про UNIX и Windows, конечно - с точки зрения переносимости куда интереснее такие платформы как Mac, Amiga, Palm, RiscOS, AS/400 и многие другие. Для особых любителей Java есть Jython. Он состоит из двух частей: во-первых, это интерпретатор Pyhon, написанный на Java, а во-вторых это компилятор Python в байт-код Java. В сравнении с Perl - Python как язык ему совершенно равномощен, но избавлен от великого множества неприятностей и неудобств, присущих Perl. Python обладает богатой стандартной библиотекой, плюс великим множеством модулей, доступных в Интернете. Для пользователей Windows есть пакет win32, из которого доступны практически все функции Windows API, DDE, COM.

Далее...

Ссылки на изменяемые объекты долго живут К изменяемым объектам в Python относятся списки, словари и объекты наследуемые от базового класса object. Будьте крайне внимательны при написании программ, помните что связь на изменяемый объект сохраняется всегда.

class M(object):
    def __init__(self, data):
        self.__data = data
    def data(self):
        return self.__data
init_data = ['php']
m = M(init_data)
print m.data() # ['php']
init_data.append('python')
# объекты init_data и M.__data ссылаются на один и тот же объект
print init_data # ['php', 'python']
print m.data() # ['php', 'python']
data = m.data()
print data # ['php', 'python']
data.append('ruby')
# теперь уже 3 объекта ссылаются на одну и ту же переменную
print data # ['php', 'python', 'ruby']
print init_data # ['php', 'python', 'ruby']
print m.data() # ['php', 'python', 'ruby']

На самом деле даже если вы отправляете объект в функцию, связь не теряется на выходе. Функция возвращает ссылку на переменную.

M = lambda data: data
init_data = ['php']
m = M(init_data)
m.append('python')
print m # ['php', 'python']
print init_data # ['php', 'python']
print m is init_data # True

Будьте внимательны при написании программ, иногда необходимо чтобы метод класса или функция вернули новый объект, а не ссылку. Создать новый объект например из списка можно - list(lst), из словаря dict(). В остальных случаях поможет модуль copy.Далее...