如何忽略构造函数属性?

时间:2019-12-10 15:58:23

标签: python python-3.x

我有一个带有构造函数的类,例如:

class Student():
    def __init__(self):
        self.firstname = ''
        self.lastname = ''
        self.number = -1

我使用此构造函数在下一个方法中比较输入值:

def transferdata(self, firstname, lastname, number):
    if (type(firstname) == type(self.firstname) and
        type(lastname) == type(self.lastname) and
        type(number) == type(self.number) and
        self.__Enterdata(firstname, lastname, number)
    else:
        return print('No data entry can be performed!')

def __Enterdata(self, firstname, lastname, number):
    self.firstname = firstname
    self.lastname = lastname
    self.number = number

std = Student()

如果我在转移数据中输入其他值类型,则示例( 字符串而不是整数)

std.transferdata('M','M','1') 我得到了回报(“无法执行任何数据输入!”)。

但是当我在控制台中调用“ std”时,我将其作为对象(“,”,“-1”)获得。

有人知道我怎么能得到一个根本不包含任何东西的物体?

非常感谢大家:)

2 个答案:

答案 0 :(得分:1)

您的条件包括and self.__Enterdata(firstname, lastname, number)。 我假设您首先想在__Enterdate中返回数据以说明数据是否正确。 但是您没有回报,因此,条件始终为假。

答案 1 :(得分:1)

错误的设计。您应该使用初始化程序来设置有效数据,并使用其他某种机制来验证数据,即

class Student(object):
    def __init__(self, firstname, lastname, number):
         self.firstname = firstname
         self.lastname = lastname
         self.number = number

    @property
    def firstname(self):
       return self._firstname

    @firstname.setter
    def firstname(self, firstname):
        if not isinstance(firstname, str):
            raise ValueError("firstname must be a string")
        self._firstname = firstname

    @property
    def lastname(self):
       return self._lastname

    @lastname.setter
    def lastname(self, lastname):
        if not isinstance(lastname, str):
            raise ValueError("lastname must be a string")
        self._lastname = lastname

    @property
    def number(self):
        return self._number

    @property.setter
    def number(self, number):
        if not isinstance(number, float):
            raise ValueError("number must be a float")
        self._number = number

现在您已经准备好以简单,标准,不复杂的方式使用您的课程:

student = Student("foo", "bar", 42.0)

try:
    Student("foo", "bar", "42")
except ValueError as e:
    print(e)

这里的要点是,不仅在实例化时,而且在您尝试直接设置值时,都将“验证”您的数据:

student = Student("foo", "bar", 42.0)
student.firstname = 666

请注意,我只是在这里使用内置的property类型-这会产生一些冗余代码-但是you can write your own computed attributes types会使您的代码保持干燥。

有关更高级的验证方案,您还可以查看Django的forms lib(涉及更多,但它是可靠,有效且编写良好的代码)。