Интерфейсы в Python: зачем вообще использовать абстрактные классы? [дубликат]Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Интерфейсы в Python: зачем вообще использовать абстрактные классы? [дубликат]

Сообщение Anonymous »

Необходимо самостоятельно изучать шаблоны проектирования для работы, поскольку они настаивают на их использовании (и интенсивном использовании ABC) в проекте Python. Я не инженер-программист, но немного знаю Python.
99% ресурсов, которые я нашел по шаблонам проектирования, написаны на Java, и у меня возникают проблемы с переводом. Одна книга, которой я пытаюсь следовать (Head First Design Patterns), достаточно логична, но все ломается, когда я пытаюсь написать что-то подобное.
Конкретно сейчас (думаю?) Я реализую шаблон стратегии через интерфейс; У меня есть класс акулы, который вызывает интерфейс еды, который имеет разные методы в зависимости от диеты.

Код: Выделить всё

from abc import ABC, abstractmethod

class eatInterface(ABC):
@abstractmethod
def eat(self):
pass

class hunt(eatInterface):
def eat(self):
return 'is hunting'

class filter_feed(eatInterface):
def eat(self):
return 'is filter feeding'

Код: Выделить всё

class Shark():
def __init__(self, shark_id, tag_id):
self.shark_id = shark_id
self.species = 'Shark'
self.tag_id = tag_id
self.eat_behaviour = eatInterface

def eat(self):
print(self.species + ' ' + str(self.shark_id) + str() + self.eat_behaviour.eat() + '.')

class GreatWhite(Shark):
def __init__(self, shark_id, tag_id):
super().__init__(shark_id, tag_id)
self.species = 'Great White Shark'
eat_behaviour = hunt
Код драйвера:

Код: Выделить всё

Sharks = []
Sharks.append(GreatWhite(shark_id=1,tag_id=583))

def sharktest():
for shark in Sharks:
shark.eat()

sharktest()
Это выдает ошибку, пока я не изменю вызов интерфейса на

Код: Выделить всё

self.eat_behaviour.eat(self)
В этот момент он возвращает None.
Я еще немного прочитал и увидел примеры, когда базовый класс (акула здесь) сделан абстрактным. и метод (eat) перегружен(?) в каждом конкретном классе (например, GreatWhite). Существует множество примеров использования для этого фигур и площадей/периметров.
Если это так, то какой смысл вообще создавать абстрактный класс/интерфейс, если вам приходится определять функцию в каждом в любом случае конкретный класс?

Подробнее здесь: https://stackoverflow.com/questions/788 ... ct-classes
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»