在Python 3.7中,这些新的“数据类”容器基本上类似于可变的namedtuple。假设我制作了一个要代表一个人的数据类。我可以通过如下__post_init__()函数添加输入验证:
@dataclass
class Person:
name: str
age: float
def __post_init__(self):
if type(self.name) is not str:
raise TypeError("Field 'name' must be of type 'str'.")
self.age = float(self.age)
if self.age < 0:
raise ValueError("Field 'age' cannot be negative.")
Run Code Online (Sandbox Code Playgroud)
这样可以通过以下方式提供良好的输入:
someone = Person(name="John Doe", age=30)
print(someone)
Person(name='John Doe', age=30.0)
Run Code Online (Sandbox Code Playgroud)
尽管所有这些错误的输入都会引发错误:
someone = Person(name=["John Doe"], age=30)
someone = Person(name="John Doe", age="thirty")
someone = Person(name="John Doe", age=-30)
Run Code Online (Sandbox Code Playgroud)
但是,由于数据类是可变的,所以我可以这样做:
someone = Person(name="John Doe", age=30)
someone.age = -30
print(someone)
Person(name='John Doe', age=-30)
Run Code Online (Sandbox Code Playgroud)
从而绕过输入验证。
因此, …