python - 处理只读用户输入的面向对象的方式
问题描述
我正在制作一个简单的命令行游戏,但不确定如何在 Python 中为只读用户输入建模。
现在,我正在考虑声明一个名为 ABCInput
并将其子类化:
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
有没有更好的方法来实现我的目标?如果是这样,它是什么?
供您参考,我的目标不仅仅是建立一个程序并运行,而是养成良好的编程习惯。请随意过于复杂并告诉我您在大型项目中更喜欢的方式(为了可伸缩性和可维护性)。
解决方案
该名称.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
就像,在 django ORM(例如http://www.effectivedjango.com/orm.htmlmodels.CharField
)中,所有这些models.XxxXxx
都是描述符。您可能想阅读更多文档(上面的链接)或检查这些项目的源代码。你可能会找到灵感:-)。
祝你好运!
推荐阅读
- php - PHP使用password_verify和password_hash验证密码
- r - 如何删除一行和一列
- java - 如何从远程机器访问 apache mina ssh 服务器?
- python - 计算两个相邻城市之间的距离
- opencv - OpenCV 4.0:类“cv::FastFeatureDetector”没有成员“DetectorType”
- javascript - setInterval 计数器问题
- sql - Notepad ++替换整个字符串,但其中的整数除外
- python - 将“for循环”更改为“while循环”
- python - python子进程不工作。它没有取代可变输出
- python-2.7 - 如何从同一应用项目中的 python2.7 微服务访问谷歌应用引擎 ndb 数据存储