Форум сайта python.su
1
Я хочу описать разные похожие объекты.
Объединить их в метакласс.
В программе вызывать представление этого метакласса и пользоваться его стандартными методами.
А на самом деле должны вызываться соответсвующие подходящие методы из родительских классов.
#!/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)
Офлайн
568
Во-первых, не используйте терминов, если не знаете их значения. Метакласс тут вообще не при чем. Метакласс - это конструктор классов, а не что-то внутри чего вы что-то там объединяете.
Во-вторых, не надо извращаться над ООП. Писать код нужно следуя идеологии какой-то парадигмы, а не выдумывать своё виденье этой парадигмы.
В-третьих, для вызова родительских методов есть ключевое слово super, его и используйте, если уж так надо (на самом деле не надо в том смысле, какой вы в это вкладываете)
Офлайн
857
>>> 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() Отломили кусок камня >>>
Офлайн
1
FishHook простите меня. Я только учусь.
py.user.next Спасибо огромное.
Но в этом случае класс Something выглядит лишним.
Отредактировано AxaRu (Июль 12, 2017 17:57:11)
Офлайн
186
self.get_something = lambda: Water.get_something(self)
Офлайн
253
AxaRuТак оно и есть. чем ваше:
класс Something выглядит лишним.
a = Something('water')
a = water()
Офлайн