ООП: Как лучше всего спроектировать этот объект? - PullRequest
2 голосов
/ 26 августа 2011

У меня есть settings объект, который содержит некоторые общие настройки.Эти настройки будут меняться для каждого пользователя.Мне интересно, что было бы лучшим способом кодировать это.Мой текущий метод таков:

class Settings(object):

    def __init__(self, user=None):

        if user and not isinstance(user, users.User):
            raise TypeError('must be a User object')

        self.user = user

    @property
    def title(self):

        if self.user:
            return 'user setting'

        return 'generic setting'

Учитывая, что в Settings будет несколько методов, каждый раз нужно будет запускать этот оператор if.

Я рассматривалналичие класса UserSettings, который расширяет Settings для переопределения значений по умолчанию и предоставления пользовательских настроек.Хотя я слышал, что переопределение методов - плохой дизайн ООП.Что приводит меня к варианту 2 ...

Затем я подумал о создании UserSettings, но он не будет расширяться Settings.Вместо этого он обернет его, и у меня будет что-то вроде:

class UserSettings(object):

    def __init__(self, user=None):

        if user and not isinstance(user, users.User):
            raise TypeError('must be a User object')

        self.user     = user
        self.settings = Settings()

    @property
    def title(self):

        return 'user setting'

Так что тогда я могу сделать:

print user_settings.title # get the user title
print user_settings.settings.title # get the generic title

Как мне это кодировать?

1 Ответ

3 голосов
/ 26 августа 2011

Методы переопределения - это не только не плохой дизайн ООП, это основа для полиморфизма подтипа , который является ядром ООП, и распространенный способ избавиться от необходимости в такихусловные проверки.

Конечно, бывают случаи, когда вы должны предпочесть композицию наследованию , но из вашего описания неясно, что делать этот подкласс неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...