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

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

Запись от Фаер размещена 07.11.2012 в 09:41
Показов 4025 Комментарии 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
Комментарии
 
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru