Вход на сайт
как правильно программировать?
785 просмотров
Перейти к просмотру всей ветки
в ответ anly 19.09.09 23:16, Последний раз изменено 20.09.09 13:27 (voxel3d)
В ответ на:
Представь себе бывает нужно поменять. Поменяешь у базового класса, поменяешь у 20ти наследников, а у 21го недоглядел, не поменял. И тогда, если у базового функция не абстрактная, то 21й наследник будет использовать именно её, а не свою специфическую. Что и есть ошибка, которая может проявиться сразу, а может и через год.
Представь себе бывает нужно поменять. Поменяешь у базового класса, поменяешь у 20ти наследников, а у 21го недоглядел, не поменял. И тогда, если у базового функция не абстрактная, то 21й наследник будет использовать именно её, а не свою специфическую. Что и есть ошибка, которая может проявиться сразу, а может и через год.
В отличии от C++ питон выкинет исключение, а не дёрнет подходящий метод из цепочки наследования сверху. Которой и не будет вовсе. Просто, надо писать на питоне, а не на C++ с синтаксисом питона.
Наследование применяется в двух случаях - для создания функциональности в предке, чтобы не дублировать её в потомке и для реализации полиморфизма: имея ссылку или указатель на базовый класс, вызывать методы определённые в потомке. Для первой цели в питоне применяют наследование, для второй - нет.
Полиморфизм реализуют так:
class Оne:
"One"
def write(self):
print "one"
class Тwo:
"Two"
def write(self):
print "two"
def writer(dest):
dest.write(" variable ")
print "start"
obj = Оne()
writer(obj)
obj = Тwo()
writer(obj)
Классы One и Two никак не обязаны быть связаными между собой, единственное, что требуется, наличие метода write(). Если мы меняем сигнатуру где-то в одном месте, а в другом забываем это сделать:
class Оne:
"One"
def write(self, var):
print "one " + var
то вызов:
def writer(dest):
dest.write(" variable ")
obj = Тwo()
writer(obj)
сгенерирует исключение:
Traceback (most recent call last):
File "test.py", line 21, in <module>
writer(obj)
File "test.py", line 12, in writer
dest.write(" variable ")
TypeError: write() takes exactly 1 argument (2 given)
Dropbox - средство синхронизации и бэкапа файлов.
