【问题标题】:Object-Oriented Way of Dealing with Read-Only User Input处理只读用户输入的面向对象的方式
【发布时间】:2019-04-25 20:52:44
【问题描述】:

我正在制作一个简单的命令行游戏,但不确定如何在 Python 中为只读用户输入建模。

现在,我正在考虑声明一个名为 Input 的 ABC 并将其子类化:

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

有没有更好的方法来实现我的目标?如果有,是什么?

供您参考,我的目标不仅仅是构建并运行一个程序,而是养成良好的编程习惯。请随意过于复杂并告诉我您在大型项目中喜欢的方式(为了可扩展性和可维护性)。

【问题讨论】:

  • 您不需要该属性,只需将value 设为属性即可。还是您试图使价值无法设置?

标签: python oop input modeling


【解决方案1】:

名称.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 属性可设置。

你可以在这里找到更多信息:How does the @property decorator work?

该属性允许您对输入或输出进行一些深入的清理(如删除 HTML 注入,...)。为了这个例子,我打电话给clean_data()

但也许,根据您的实际情况,您可能想要创建自己的描述符,以便您可以重复使用它们。例如,这就是在 ORM 中发生的事情。更多信息:https://docs.python.org/3.7/howto/descriptor.html

就像,在 django ORM(例如 http://www.effectivedjango.com/orm.html )中,所有这些 models.CharFieldmodels.XxxXxx 都是描述符。您可能想阅读更多文档(上面的链接)或检查这些项目的源代码。你可能会找到灵感:-)。

祝你好运!

【讨论】:

  • 他们为什么要使用setter?也许他们不希望它是可设置的。我完全同意pop,顺便说一句。
  • 正如我提到的,“如果你想让你的 value 属性可设置”。这并不意味着 OP 必须始终实现它。 :)
  • 那么他们在什么意义上滥用它?
  • 输入参数。对于 getter,应该只有 self
  • 啊,完全错过了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多