Уведомления

Группа в Telegram: @pythonsu

#1 Июль 12, 2017 17:30:25

AxaRu
Зарегистрирован: 2015-04-11
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Как явно указать наследуемый метод?

Я хочу описать разные похожие объекты.
Объединить их в метакласс.
В программе вызывать представление этого метакласса и пользоваться его стандартными методами.
А на самом деле должны вызываться соответсвующие подходящие методы из родительских классов.

 #!/usr/bin/env python3
class Water:
    def get_something(self):
        print('Вот налили воды')
class Sand:
    def get_something(self):
        print('Вот насыпали песку')
class Stone:
    def get_something(self, theme: str):
        print('Отломили кусок камня')
class Something(Sand, Water, Stone):
    def __init__(self, store_type):
        if store_type == 'water':
            get_something = Water.get_something
        elif store_type == 'stone':
            get_something = Stone.get_something
        elif store_type == 'sand':
            get_something = Sand.get_something
        else:
            exit(1)
if __name__ == "__main__":
    print("Начинаем !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
    p = Something('water')
    p.get_something()
    p = Something('stone')
    p.get_something()
    p = Something('sand')
    p.get_something()

Не получается.
 ./test_class.py
Начинаем !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Вот насыпали песку
Вот насыпали песку
Вот насыпали песку

Подскажите как правильно это организовать

Отредактировано AxaRu (Июль 12, 2017 17:32:28)

Офлайн

#2 Июль 12, 2017 17:37:13

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

Как явно указать наследуемый метод?

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



Офлайн

#3 Июль 12, 2017 17:47:59

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

Как явно указать наследуемый метод?

  
>>> class Water:
...     def get_something(self):
...         print('Вот налили воды')
... 
>>> class Sand:
...     def get_something(self):
...         print('Вот насыпали песку')
... 
>>> class Stone:
...     def get_something(self):
...         print('Отломили кусок камня')
... 
>>> class Something:
...     def __init__(self, obj):
...         self.obj = obj
...     def get_something(self):
...         self.obj.get_something()
... 
>>> obj = Something(Water())
>>> obj.get_something()
Вот налили воды
>>> 
>>> obj = Something(Sand())
>>> obj.get_something()
Вот насыпали песку
>>> 
>>> obj = Something(Stone())
>>> obj.get_something()
Отломили кусок камня
>>>



Офлайн

#4 Июль 12, 2017 17:53:14

AxaRu
Зарегистрирован: 2015-04-11
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Как явно указать наследуемый метод?

FishHook простите меня. Я только учусь.

py.user.next Спасибо огромное.
Но в этом случае класс Something выглядит лишним.

Отредактировано AxaRu (Июль 12, 2017 17:57:11)

Офлайн

#5 Июль 12, 2017 19:28:40

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2842
Репутация: +  186  -
Профиль   Отправить e-mail  

Как явно указать наследуемый метод?

 self.get_something = lambda: Water.get_something(self)



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#6 Июль 12, 2017 21:54:01

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Как явно указать наследуемый метод?

AxaRu
класс Something выглядит лишним.
Так оно и есть. чем ваше:
 a = Something('water')
лучше чем:
 a = water()



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version