对象比较,如下所示:
-
other = Name("Mohan")
-
if name == other:
-
print("same")
Name
值对象的最终版本:-
from dataclasses import dataclass
-
@dataclass(frozen=True)
-
class Name:
-
value: str
-
def __post_init__(self):
-
if self.value is None or len(self.value.strip()) < 8 or len(self.value.strip()) > 32:
-
raise ValueError("Invalid Name")
PhoneNumber
也遵循类似的方法,因为它也是一个值对象:-
@dataclass(frozen=True)
-
class PhoneNumber:
-
value: int
-
def __post_init__(self):
-
if self.value < 9000000000:
-
raise ValueError("Invalid Phone Number")
User
类是一个实体,不是一个值对象 。换句话说,User
是可变的 。以下是结构:-
from dataclasses import dataclass
-
import datetime
-
@dataclass
-
class User:
-
_name: Name
-
_phone: PhoneNumber
-
_since: datetime.datetime
-
def __post_init__(self):
-
if self._name is None or self._phone is None:
-
raise ValueError("Invalid user")
-
if self._since is None:
-
self.since = datetime.datetime.now()
User
并没有冻结,因为我们希望它是可变的 。但是,我们不希望所有属性都是可变的 。标识字段如_name
和_since
是希望不会修改的 。那么,这如何做到呢?Python3 提供了所谓的描述符协议,它会帮助我们正确定义 getter 和 setter 。让我们使用
@property
装饰器将 getter 添加到User
的所有三个字段中 。-
@property
-
def name(self) -> Name:
-
return self._name
-
@property
-
def phone(self) -> PhoneNumber:
-
return self._phone
-
@property
-
def since(self) -> datetime.datetime:
-
return self._since
phone
字段的 setter 可以使用@<字段>.setter
来装饰:-
@phone.setter
-
def phone(self, phone: PhoneNumber) -> None:
-
if phone is None:
-
raise ValueError("Invalid phone")
-
self._phone = phone
通过重写
__str__()
函数,也可以为User
提供一个简单的打印方法:-
def __str__(self):
-
return self.name.value + " [" + str(self.phone.value) + "] since " + str(self.since)
-
class UserNotFoundException(Exception):
-
pass
UserRepository
了 。Python 提供了一个名为
推荐阅读
- Adobe的人工智能原型可将物体粘贴到照片上 同时添加逼真的照明和阴影
- 适合在家里养的小宠物有哪些,有什么适合家里养的小动物-
- 谢芳|妻子刚生下女儿,就对丈夫说:先给我10万,然后再买一个房子写上我的名字
- 麻将桌上老赢钱的人有什么特点?
- 扑克争上游基本玩法
- 葫芦在家居风水里有什么作用?该放在什么位置?
- 30年前的一分钱现在值多少钱?有没有收藏价值?
- 郭碧婷和向佐在一起多久结婚,郭碧婷向佐结婚了吗-
- 百慕大三角有人吗,百慕大三角存不存在-
- 项羽在什么战役中失败,项羽在楚汉之争中最终失败的原因是什么-