Когда вы подходите к проблеме с OOP, вы обычно хотите моделировать поведение и свойства с возможностью повторного использования, то есть вы должны думать об абстракциях и организовывать иерархию классов на основе этого.
Я бы написал что-то вроде следующего:
class Card:
def __init__(self, money_value=0):
self.money_value = money_value
class ActionCard(Card):
def __init__(self, action, money_value=0):
super().__init__(money_value=money_value)
self.action = action
class RentActionCard(ActionCard):
def __init__(self, action, color, money_value=0):
super().__init__(action, money_value=money_value)
self.color = color
def apply(self, property_card):
if property_card.color != self.color:
# Don't apply
# Apply
class PropertyCard(Card):
def __init__(self, color, money_value=0):
super().__init__(money_value=money_value)
self.color = color
class WildcardPropertyCard(PropertyCard):
def __init__(self, color, money_value=0):
super().__init__(color, money_value=money_value)
class MoneyCard(Card):
def __init__(self, money_value=0):
super().__init__(money_value=money_value)
Поскольку Python является динамически типизированным языком, OOP является немного сложнее оправдать, на мой взгляд, поскольку мы можем просто положиться на утку, набрав и dynamici c привязку , способ организации вашей иерархии менее важен.
Если бы я смоделировал эту проблему, например, в C#, я без сомнения использовал бы иерархию, показанную выше, потому что я мог бы полагаться на полиморфизм для представления различных типов и руководства поток моих логи c в зависимости от типа анализируемой карты.
Пара заключительных замечаний:
- Python имеет очень мощные встроенные типы, но большую часть времени используют новые пользовательские типы, основанные на них, облегчают вашу жизнь.
- Вам не нужно наследовать от
object
, поскольку типы в Python 3 (который является единственным поддерживаемым с сегодня) наследуются от object
по умолчанию.
Но, в конце концов, нет идеального ответа, лучший способ - попробовать оба подхода и посмотреть, что вам удобнее.