在构造函数-Python 3.3中设置值时验证值
我在Python中有一个设计问题,但我在语言、设计和异常方面都不是很高级 这是我想要的:我有一个具有名称、预算等属性的类。。。我希望不可能创建名称小于3个符号且预算小于0的对象。我还希望在更改某些值时,再次检查它们。若您试图创建一个不符合此条件的对象,我希望抛出异常 以下是我尝试过的:在构造函数-Python 3.3中设置值时验证值,python,python-3.3,Python,Python 3.3,我在Python中有一个设计问题,但我在语言、设计和异常方面都不是很高级 这是我想要的:我有一个具有名称、预算等属性的类。。。我希望不可能创建名称小于3个符号且预算小于0的对象。我还希望在更改某些值时,再次检查它们。若您试图创建一个不符合此条件的对象,我希望抛出异常 以下是我尝试过的: def __init__(self, name, budget): try: self.set_name(name) self.set_budget(budget)
def __init__(self, name, budget):
try:
self.set_name(name)
self.set_budget(budget)
except Exception as e:
print(e)
return None
def set_name(name):
if len(name) < 3:
raise Exception("short name")
else:
self.__name = name
def\uuuuu init\uuuuuuu(自我、姓名、预算):
尝试:
self.set_名称(name)
自我设置预算(预算)
例外情况除外,如e:
打印(e)
一无所获
def set_名称(名称):
如果len(名称)<3:
引发异常(“短名称”)
其他:
self.\uu name=名称
但这里我有两个问题:(第一个问题是,即使我尝试创建名为“a”的对象,例如它也被创建了:(我不想创建无效的对象。第二个问题是我的init方法中有print,我不想在其中包含任何I/O函数。但是如何获取消息?如何从构造函数获取不创建对象的原因是什么
此外,这是一项非常简单的任务,我不想用复杂、太长、太难的解决方案来完成:(
你能帮帮我吗?非常感谢你!:)
这是一个非常简单的任务,我不想用复杂、太长、太难的解决方案来完成它
这是造成IT世界现在如此悲观和厄运的原因啊,真让人心碎,但好吧,我们将保持简单:)
您想确认len(name)>=3
和budget>=0
,对吗?让我们这样做:
class Dummy(object):
def __init__(self, name, budget):
self.name = name
self.budget = budget
@property
def name(self):
return self.__name
@name.setter
def name(self,value):
self.validatename(value)
self.__name = value
@property
def budget(self):
return self.__budget
@budget.setter
def budget(self,value):
self.validatebudget(value)
self.__budget = value
def validatename(self,value):
if len(value) < 3:
raise Exception("Some descriptive error here")
def validatebudget(self,value):
if isinstance(value,str):
value = float(value) # this is more common than you'd think
if value < 0:
raise Exception("Some descriptive error here")
非常感谢!这似乎是一个很好的解决方案。如果您有时间并且愿意的话,请告诉我您所在行业的最佳解决方案。:)我可以用简洁换取良好的设计和优雅:)@我真的没有时间玩一个实现,而且我还没有使用足够多的装饰程序,在不测试解决方案的情况下就匆匆忙忙地推出一个解决方案。我将实现
validatename
和validatebudget
,就像在name.setter
和budget.setter
上使用某种装饰器一样,如果输入不被接受,它将重新提示用户。也可能有一个通用的validate
decorator函数,它接受描述过滤器的lambda
(例如lambda x:len(x)>=3
表示validatename
)。我会和装饰师一起玩很多类似的东西。@Faery装饰师是一个更高级的东西,但如果你花点时间研究它,可能不会超出你的范围。如果这是你感兴趣知道的事情,而不仅仅是你感兴趣做的事情,我建议你去看看。@property
行和@name.setter
行都是装饰师工作的例子。对象
类内置了这两个decorator函数,它们按照描述工作。非常感谢!)我不需要精确的实现,只要decorator这个词就足够了!我会检查的。:)再次感谢您提供的有用建议。@Faery我对\uuuuu init\uuuuu
函数做了一个小小的更改,使整个过程看起来更简单。我不确定它是否会工作,直到现在才有时间进行测试(我很高兴我未测试的代码按预期工作!)
>>> testobj = Dummy("Adam",100000)
# no error
>>> testobj.name
"Adam"
>>> testobj.budget
100000
>>> testobj.name = "Brian"
>>> testobj.name
"Brian"
>>> testobj.name = "Ed"
Traceback (most recent call last):
File "<pyshell#40>", line 1, in <module>
testobj.name = "Ed"
File "<pyshell#34>", line 12, in name
self.validatename(value)
File "<pyshell#34>", line 24, in validatename
raise Exception("Some descriptive error here")
Exception: Some descriptive error here