当前位置: 首页 > 面试题库 >

验证类实例属性的正确方法

云焱
2023-03-14
问题内容

有一个像这样的简单Python类:

class Spam(object):
    __init__(self, description, value):
        self.description = description
        self.value = value

我想检查以下约束:

  • “说明不能为空”
  • “值必须大于零”

我应该:
1.在创建垃圾邮件对象之前验证数据吗?
2.检查__init__方法上的数据?
3.is_valid在Spam类上创建一个方法,并使用spam.isValid()进行调用?
4.is_valid在Spam类上创建一个静态方法,并使用Spam.isValid(description,value)进行调用?
5.检查二传手声明中的数据?
6.等

您能推荐一个设计良好/ Pythonic /不冗长(在具有许多属性的类上)/优雅的方法吗?


问题答案:

您可以使用Python属性将规则明确地分别应用于每个字段,并且即使客户端代码尝试更改该字段也可以强制执行这些规则:

class Spam(object):
    def __init__(self, description, value):
        self.description = description
        self.value = value

    @property
    def description(self):
        return self._description

    @description.setter
    def description(self, d):
        if not d: raise Exception("description cannot be empty")
        self._description = d

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, v):
        if not (v > 0): raise Exception("value must be greater than zero")
        self._value = v

任何违反规则的尝试都将引发异常,即使是在__init__函数中,在这种情况下,对象构造也会失败。

更新: 从2010年到现在,我了解到operator.attrgetter

import operator

class Spam(object):
    def __init__(self, description, value):
        self.description = description
        self.value = value

    description = property(operator.attrgetter('_description'))

    @description.setter
    def description(self, d):
        if not d: raise Exception("description cannot be empty")
        self._description = d

    value = property(operator.attrgetter('_value'))

    @value.setter
    def value(self, v):
        if not (v > 0): raise Exception("value must be greater than zero")
        self._value = v


 类似资料:
  • 问题内容: 我的项目使用Node.js和Express,但问题在于通用方法。 我们的用户全部来自FB,除FB外,我们没有其他任何身份验证。我们需要将某些操作与特定的FB用户相关联,还需要他们的令牌才能与FB通信。 目前, 我们这样做: 用户来到页面 有一些 看不见的 块:一个带有占位符,用于存储用户的化身和姓名(“已登录”),另一个带有用于触发FB登录的按钮(“已退出”) 使用FB JS SDK,

  • 由于Python是动态语言,根据类创建的实例可以任意绑定属性。 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Student(object): def __init__(self, name): self.name = name s = Student('Bob') s.score = 90 但是,如果Student类本身需要绑定一个属性呢?可

  • 也许我错过了什么,如果是这样原谅我的无知。 在这里,我们有什么: 我们在Kafka集群中使用TLS身份验证侦听器(这可以更改,我们可以添加新类型的侦听器) 当从Java代码连接到Kafka主题时,我使用为Kafka用户生成的SSL证书 如果我决定避免使用SSL证书,原因有两个: < li >我将仅从受信任的OpenShift cluster PODs连接到Kafka主题 < li >为了避免在生产

  • 主要内容:类变量(类属性),实例变量(实例属性),局部变量无论是类属性还是类方法,都无法像普通变量或者函数那样,在类的外部直接使用它们。我们可以将类看做一个独立的空间,则类属性其实就是在类体中定义的变量,类方法是在类体中定义的函数。 前面章节提到过,在类体中,根据变量定义的位置不同,以及定义的方式不同,类属性又可细分为以下 3 种类型: 类体中、所有函数之外:此范围定义的变量,称为类属性或类变量; 类体中,所有函数内部:以“self.变量名”的方式定义的

  • 问题内容: 我是python的新手,了解到类属性就像C ++中的静态数据成员一样。但是,尝试以下代码后,我感到困惑: f2.a是否也等于5? 如果将a定义为列表而不是整数,则预期行为: 我研究了 Python:类和实例属性之间的区别,但是它不能回答我的问题。 谁能解释为什么会有所不同?谢谢 问题答案: 在第二个示例中,您没有做相同的事情。在第一个示例中,您要分配一个新值: 在第二个示例中,您只是在

  • 我需要构建一个Weka分类器,然后使用它来预测未来的实例。这里有一个很好的入门来源。不幸的是,我注意到未来的实例不需要与源训练数据的格式匹配。 如何利用训练数据和新实例之间的这种差异进行预测? 示例火车: @关系列车 @属性A1{e,f,g} @属性A2数值 @属性A3数值 @属性A4{正,负} @数据 e,-100,100,阳性 f,-10,10,阳性 g,-90,90,阴性 示例测试: @关系