Форум программистов, компьютерный форум, киберфорум
Фаер
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  

Python. ООП. Часть 2.

Запись от Фаер размещена 07.11.2012 в 09:41
Показов 3928 Комментарии 0

Кое-чему по ходу прошлой записи, если Вы её читали, Мы уже научились. Теперь можно взяться и за более серьёзные приёмы объектно - ориентированного программирования. Одним из самых мощных инструментов данной парадигмы является наследование. Сдаётся мне, что пояснять значение этого слова не требуется.

Если Вы помните, в прошлой записи Мы создали класс под названием car(). Можно догадаться, что любой сотворённый Вами или взятый откуда-то готовый класс создан для того, чтобы использовать его множество раз. Так что давайте сохраним свеженаписанный car() для будущих поколений. Для этого достаточно в чистый скрипт занести описание Нашего класса и, сохранив, перенести его в папку .../Python33/lib, туда, где содержатся стандартные модули. Теперь можно в любой программе смело написать:

Python
1
from name_of_script import car
и самым что ни на есть свободным образом создать экземпляр загруженного класса. Учтите, что команды, содержащиеся в модуле, будут выполнены при импортировании. Чтобы не нарушать порядок, заносите в модули только описания классов и функций:

Python
1
2
3
4
5
6
7
8
class car:
    def __init__(self,...):
        ....
    def method(self,...):
        ....
 
def function():
    ...
Но не будем отступать от наследования. Возьмём несколько видоизменённый класс car():

Python
1
2
3
4
5
6
7
8
class car:
    def __init__(self,name,age,color,speed=150):
        self.name=name
        self.age=age
        self.color=color
        self.speed=speed
    def accelerate(self,nspeed):
        self.speed+=nspeed
И с помощью наследования опишем на его основе новый класс:

Python
1
2
3
class moto(car):
    def repair(self):
        self.age-=8
Обратите внимание: сразу после названия(moto) Мы написали: "(car):", где car - класс, свойства которого должен приобрести moto. Пишем следующие команды:

Python
1
2
3
4
5
m=moto('Suzuki',12,'Red',210)
m.accelerate(20)
m.speed#в консоли пишете print(m.speed)
m.repair()
m.age
Как видите, объект moto() реагирует на вызов методов, присущих car(). Классы практически аналогичны, с той лишь разницей, что moto() содержит в себе метод repair(), которого нет в car(). Грубо говоря, Мы скопировали класс car() и дописали туда новую функцию.
Так же можно заменить наследуемый метод другим, просто описав его в новом классе под таким же именем. Согласитесь, это очень удобно: moto() конструируется так же, как car(), принимая те же аргументы, имея те же параметры, те же методы + его собственные качества. Вместо того, чтобы описывать класс с нуля, Мы берём готовый и дополняем/изменяем его.

Класс car() при этом становится суперклассом(родительским классом) - классом, на основе которого создаются другие классы(подклассы, дочерние классы). Узнать кто "родитель" того или иного класса можно с помощью атрибута __bases__:

Python
1
print(moto.__bases__)
Результат выполнения команды:

(<class '__main__.car'>,)

А вот если Вам нужно получить название класса, к которому относится некий объект используйте:

Python
1
(m.__class__)
Хотелось бы сделать небольшое замечание:
Присвоение экземпляра класса некой переменной приводит к тому, что Вы создаёте ссылку на объект. Например:

Python
1
2
3
4
5
c=car('Audi',5,'Green')
m=c
m.accelerate(10)#вызов метода изменит и c, и m
print(m.speed)
print(c.speed)
На выходе Вы получите два одинаковых числа, так как c и m - это ссылки на один и тот же объект. О том, как с этим бороться, Мы поговорим в следующий раз, когда будем рассматривать прототипное программирование.

А сейчас на небольшом примере посмотрим, как с помощью наследования можно расширить класс предоставляемый стандартным API Python'а. Сделаем маленькое окно с полем для ввода:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from tkinter import *
 
class nent(Entry):
    def clear(self):
        self.delete(0,END)
    def fcol(self):
        color=self.get()
        self.config(bg=color)
    def tcol(self):
        color=self.get()
        self.config(fg=color)
 
window=Tk()
ent=nent(window)
ent.pack(side=TOP)
fr=Frame(window)
Button(fr,text='Delete',command=(lambda:ent.clear())).pack(side=LEFT)
Button(fr,text='FontColor',command=(lambda:ent.fcol())).pack(side=LEFT)
Button(fr,text='TextColor',command=(lambda:ent.tcol())).pack(side=LEFT)
fr.pack(side=TOP)
window.mainloop()
После запуска скрипта напишите в появившемся поле для ввода слово "Red" и нажмите кнопку FontColor. Теперь нажмите кнопку Delete, введите "Yellow" и нажмите TextColor.
Вот так просто Мы берём виджет Entry() и создаём на его основе класс с трёмя новыми методами (заметьте, что Мы точно так же, как Entry(), привязываемый экземпляр nent к окну и точно так же его pack()'уем). Разумеется, это маленький пример, ООП - мощная парадигма программирования, способная на гораздо большее.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru