在 Kubernetes 上使用 Flask 搭建 Python 微服务( 二 )

对象比较,如下所示:
 

  1. other = Name("Mohan")
     
  2. if name == other:
     
  3. print("same")
     
如你所见,对象比较的是值而不是引用 。这一切都是开箱即用的 。我们还可以通过冻结对象使对象不可变 。这是Name值对象的最终版本:
 
  1. from dataclasses import dataclass
     
  2. @dataclass(frozen=True)
  3. class Name:
  4. value: str
  5. def __post_init__(self):
  6. if self.value is None or len(self.value.strip()) < 8 or len(self.value.strip()) > 32:
  7. raise ValueError("Invalid Name")
     
PhoneNumber也遵循类似的方法,因为它也是一个值对象:
 
  1. @dataclass(frozen=True)
     
  2. class PhoneNumber:
     
  3. value: int
     
  4. def __post_init__(self):
     
  5. if self.value < 9000000000:
     
  6. raise ValueError("Invalid Phone Number")
     
 
User类是一个实体,不是一个值对象 。换句话说,User是可变的 。以下是结构:
 
  1. from dataclasses import dataclass
     
  2. import datetime
     
  3. @dataclass
  4. class User:
  5. _name: Name
  6. _phone: PhoneNumber
  7. _since: datetime.datetime
  8. def __post_init__(self):
  9. if self._name is None or self._phone is None:
  10. raise ValueError("Invalid user")
  11. if self._since is None:
  12. self.since = datetime.datetime.now()
     
你能观察到User并没有冻结,因为我们希望它是可变的 。但是,我们不希望所有属性都是可变的 。标识字段如_name_since是希望不会修改的 。那么,这如何做到呢?
Python3 提供了所谓的描述符协议,它会帮助我们正确定义 getter 和 setter 。让我们使用@property装饰器将 getter 添加到User的所有三个字段中 。
 
  1. @property
  2. def name(self) -> Name:
  3. return self._name
  4. @property
  5. def phone(self) -> PhoneNumber:
  6. return self._phone
  7. @property
  8. def since(self) -> datetime.datetime:
  9. return self._since
phone字段的 setter 可以使用@<字段>.setter来装饰:
 
  1. @phone.setter
  2. def phone(self, phone: PhoneNumber) -> None:
  3. if phone is None:
  4. raise ValueError("Invalid phone")
  5. self._phone = phone
 
通过重写__str__()函数,也可以为User提供一个简单的打印方法:
 
  1. def __str__(self):
  2. return self.name.value + " [" + str(self.phone.value) + "] since " + str(self.since)
     
这样,域模型的实体和值对象就准备好了 。创建异常类如下所示:
 
  1. class UserNotFoundException(Exception):
  2. pass
     
域模型现在只剩下UserRepository了 。Python 提供了一个名为


推荐阅读