Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 15, 2015 08:57:31

lobster
От:
Зарегистрирован: 2011-06-09
Сообщения: 82
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Всех приветствую!

class BaseHandler(object):
    def __init__(self):
        self.hello = 'hello'
class One(BaseHandler):
    def __init__(self, arg):
        self.arg = arg
        BaseHandler.__init__(self)
        self.run()
    def run(self):
        print("%s : %s" % (self.hello, self.arg))
class Two(BaseHandler):
    def __init__(self, arg):
        self.arg = arg
        BaseHandler.__init__(self)
        self.run()
    def run(self):
        print("%s : %s" % (self.hello, self.arg))
Возможно ли, как нибудь вынести конструктор детей(One, Two, …) в отдельный класс или функцию, чтобы избежать дублирование кода?



Офлайн

#2 Авг. 15, 2015 09:26:59

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

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

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



Офлайн

#3 Авг. 15, 2015 09:29:23

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

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

Так у вас тут One от Two не отличается. Ну сделайте так:

class BaseHandler(object):
    def __init__(self):
        self.hello = 'hello'
class AnotherHandler(BaseHandler):
    def __init__(self, arg):
        self.arg = arg
        BaseHandler.__init__(self)
        self.run()
    def run(self):
        print("%s : %s" % (self.hello, self.arg))
class One(Another):pass
class Two(Another):pass



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Авг. 15, 2015 09:45:29

lobster
От:
Зарегистрирован: 2011-06-09
Сообщения: 82
Репутация: +  0  -
Профиль   Отправить e-mail  

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

JOHN_16
Благодарю за пример, оказывается все проще :)
FishHook
Да я все понимаю, просто до этого всю дорогу писал в императивном стиле, а не так давно стал изучать ооп и походу дела применять это на практике.
Еще кстати вот про функцию super(), если к примеру класс наследуется от двух классов, как в таком случае инициализировать конструктор ребенка, при помощи super() ?



Офлайн

#5 Авг. 15, 2015 14:35:00

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

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

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



Офлайн

#6 Авг. 15, 2015 15:19:10

lobster
От:
Зарегистрирован: 2011-06-09
Сообщения: 82
Репутация: +  0  -
Профиль   Отправить e-mail  

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

FishHook
Все понятно, Спасибо!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version