我有一个带有构造函数的类,例如:
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”)获得。
有人知道我怎么能得到一个根本不包含任何东西的物体?
非常感谢大家:)
答案 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(涉及更多,但它是可靠,有效且编写良好的代码)。