在构造函数-Python 3.3中设置值时验证值

在构造函数-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)

我在Python中有一个设计问题,但我在语言、设计和异常方面都不是很高级

这是我想要的:我有一个具有名称、预算等属性的类。。。我希望不可能创建名称小于3个符号且预算小于0的对象。我还希望在更改某些值时,再次检查它们。若您试图创建一个不符合此条件的对象,我希望抛出异常

以下是我尝试过的:

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