Объектно-ориентированный способ работы с пользовательским вводом только для чтения - PullRequest
0 голосов
/ 23 ноября 2018

Я делаю простую игру командной строки, но не знаю, как моделировать пользовательские вводы только для чтения в Python.

Сейчас я думаю об объявлении ABC под названием Input и создании подклассов.it:

import abc


class Input(abc.ABC):
    @abc.abstractmethod
    def is_valid(self, *args, **kwargs):
        pass

    @abc.abstractmethod
    def pop(self):
        pass


class NameInput(Input):
    def __init__(self, name):
        self._name = name

    def is_valid(self, *args, **kwargs):
        pass

    def pop(self):
        return self._name

Еще один способ, с помощью которого я придумал, - использовать декоратор @property:

import abc


class Input(abc.ABC):
    @abc.abstractmethod
    def is_valid(self, *args, **kwargs):
        pass

    @abc.abstractmethod
    def value(self, value, *args, **kwargs):
        pass


class NameInput(Input):
    def __init__(self, name):
        self._name = name

    def is_valid(self, *args, **kwargs):
        pass

    @property
    def value(self, value, *args, **kwargs):
        return self._name

Есть ли лучший способ достичь моей цели?Если да, то что это?

Для вашей информации, моя цель - не просто создать и запустить программу, а выучить хорошие привычки программирования.Пожалуйста, не стесняйтесь слишком усложнять и скажите мне, как вы предпочитаете (ради масштабируемости и ремонтопригодности) в крупномасштабном проекте.

1 Ответ

0 голосов
/ 23 ноября 2018

Имя .pop() почти зарезервировано для стеков.Вы не должны использовать это, поскольку поведение, которое вы здесь делаете, отличается.

@property довольно хорошо, но вы его неправильно используете.Оно должно быть:

class NameInput(Input):
    def __init__(self, name):
        self._name = name

    def is_valid(self, *args, **kwargs):
        pass

    @property
    def value(self):
        return clean_data(self._name)

    @value.setter
    def value(self, value):
        self._name = value

Вторая функция value предназначена для установки свойства value.

Более подробную информацию можно найти здесь: Как это сделать@property декоратор работает?

Свойство позволяет выполнить некоторую углубленную очистку (например, удаление HTML-инъекций, ...) при вводе или выводе.Я призываю clean_data() ради примера.

Но, возможно, в зависимости от того, что у вас есть на самом деле, вы можете захотеть создать свои собственные дескрипторы, чтобы вы могли использовать их повторно.Вот что происходит в ORM, например.Дополнительная информация: https://docs.python.org/3.7/howto/descriptor.html

Например, в ORM django (например, http://www.effectivedjango.com/orm.html) все эти models.CharField и models.XxxXxx являются дескрипторами.Вы можете прочитать дополнительную документацию (ссылка выше) или проверить исходный код этих проектов.Вы можете найти вдохновение: -).

Удачи!

...