Форум сайта python.su
0
Суть в следующем: Раньше я имел дело только с процедурными языками, писал некоторые скрипты на процедурных языках. Недавно я столкнулся с ООП и для меня остаются непонятными многие вещи, а в частности - наследование:
Я изучаю Пайтон по книге «A Byte of Python 2.0» (Для Пайтон 3) и на 108 странице этой книги (на русском) есть параграф, посвященный наследованию. Как объясняется, само наследование создано для упрощения жизни программисту. Но из примера, приведенного в том же параграфе, я не совсем понял, что именно там упрощается? Что вообще там наследуется? То, что не нужно создавать поля (если не ошибаюсь, а то для меня переменные - и в африке переменные, и в “классах” тоже)? Точнее сказать - определять их. Но тогда ведь в параметрах методов все-равно придется принимать и новосозданные поля из родительского класса? И надо опять редачить код метода в субклассах? И смысл этого наследования тогда?
Если я что-то не понял - объясните пожалуйста)
А вот и собственно сам код:
class SchoolMember: def __init__(self, name, age): self.name = name self.age = age print('(Создан ScoolMember: {0})'.format(self.name)) def tell(self): print('Имя:"{0}" Возраст:"{1}"'.format(self.name,self.age), end = " ") class Teacher(SchoolMember): def __init__(self, name, age, salary): SchoolMember.__init__(self, name, age) self.salary = salary print('(Создан Teacher: {0})'.format(self.name)) def tell(self): SchoolMember.tell(self) print('Зарплата: "{0:d}"'.format(self.salary)) class Student(SchoolMember): def __init__(self, name, age, marks): SchoolMember.__init__(self, name, age) self.marks = marks print('(Создан Teacher: {0})'.format(self.name)) def tell(self): SchoolMember.tell(self) print('Зарплата: "{0:d}"'.format(self.marks)) t = Teacher('Slut Number One',25,900000) s = Student('Punk Number One',25,756891297) members = [t,s] for member in members: member.tell() input('Press Enter')
Отредактировано Ethan (Фев. 8, 2016 22:37:38)
Офлайн
1
Какая разница, упрощает ли жизнь ООП, программистам использующим ООП? Если вам лично не упрощает (ввиду сложности понимания концепции ООП) значит не используйте его. Это не серебряная пуля, а вопрос личной приверженности и вкуса.
Отредактировано Rudium (Фев. 9, 2016 03:52:16)
Офлайн
568
import datetime class Person(object): def __init__(self, name, age): self.name = name self.age = age print('(Создан ScoolMember: {0})'.format(self.name)) def born_year(self): return datetime.datetime.today().year - self.age def tell(self): print('Имя:"{0}" Возраст:"{1}"'.format(self.name,self.age)) class SchoolMember(Person): def __init__(self, name, age, salary): super(SchoolMember, self).__init__(name, age) self.salary = salary print('(Создан Teacher: {0})'.format(self.name)) def tell(self): super(SchoolMember, self).tell() print('Зарплата: "{0:d}"'.format(self.salary)) class Teacher(SchoolMember): iq = 160 def moo(self): print("I am teacher") class Student(SchoolMember): iq = 63 def moo(self): print("I am studentr") t = Teacher('Slut Number One',25, 900000) s = Student('Punk Number One',25, 756891297) print (s.born_year(), t.born_year()) print (s.moo(), t.moo()) print (s.iq, t.iq) s.tell() t.tell()
Офлайн
568
RudiumСтранная позиция. Питон - объектно-ориентированный язык, хочется вам этого или нет. С этим фактом придется смириться и принять. Каждый ЯП исповедует какую-то свою идеологию, и вы либо принимаете её и используете предоставленные возможности либо ищите для себя другой инструмент. Если ООП для кого-то слишком сложная концепция, то этому товарищу нужно идти подметать трамвайные пути или крутить хвосты коровам.
Какая разница, упрощает ли жизнь ООП, программистам использующим ООП? Если вам лично не упрощает (ввиду сложности понимания концепции ООП) значит не используйте его. Это не серебряная пуля, а вопрос личной приверженности и вкуса.
Офлайн
1
FishHookPython - мультипарадигменный язык. Хочется вам этого или нет, но можно написать на нем программу без ООП. Вы путаете Python с Ruby. Ruby - объектно-ориентированный язык.
Отредактировано Rudium (Фев. 9, 2016 07:15:50)
Офлайн
568
RudiumА вы знаете, вообще много чего можно. Можно, например, ногами рулить, а руками на педали нажимать.
но можно написать на нем программу без ООП
Офлайн
1
Сообщите это Гвидо Ван Россуму, сделавшему Python мультипарадигменным, а не объектно-ориентированным как вы считаете.
Офлайн
568
Rudium
a = 1 print dir(a)
Офлайн
1
Конечно не делает. Это делает язык объектным. Я могу написать программу которая не будет использовать наследование на Python, потому что такую возможность намеренно предусмотрел создатель языка. Моя программа будет считаться программой с использованием абстрактных типов, а для ООП обязательно наследование.
Отредактировано Rudium (Фев. 9, 2016 08:31:45)
Офлайн
568
RudiumКакую-бы программу на питоне вы не написали, хоть в один байт, эта программа будет использовать объекты, потому что в питоне ВСЁ ЕСТЬ ОБЪЕКТ, поэтому он объектно-ориентированный. Вся остальная мультипагадигменность вторична, поскольку даже функции являются объектами, даже модули и даже основополагающие типы.
Конечно не делает. Это делает язык объектным. Я могу написать программу которая не будет использовать наследование на Python, потому такую возможность намеренно предусмотрел создатель языка.
Офлайн