



























@property 是Python的一个内置函数, 通过property, 我们可以获得更好的可读性/可维护性
扩散到其他地方, 后续变更修改更容易代码坏味道:
[1, 2, 3](type: list) 以及原始值1,2,3(type: str)使用property之后:
[1, 2, 3]思路: 将属性通用的处理内化, fat model对外屏蔽细节, 避免了使用者的冗余代码以及过多的认知负担;
set/get/delete 操作时, 额外进行一些处理, 例如校验, 做一些额外变更等(存在副作用)facade 模式的作用, 将更多的细节封装, 对外屏蔽, 只暴露有限的内容class Student(object):
@property
def score(self):
return self._score
@score.setter
def score(self, value):
if not isinstance(value, int):
raise ValueError('score must be an integer!')
if value < 0 or value > 100:
raise ValueError('score must between 0 ~ 100!')
self._score = value
class Student(object):
@property
def birth(self):
return self._birth
class Staff:
@property
def email(self):
return f'{self.username}@{self.domain}'
下面示例是django 中的一种用法, 在db中字段名为maintainers, 是一个字符串, 但是对于模型使用者, maintainers是一个列表, 通过property, 屏蔽了字段类型/分隔符等细节
class API(models.Model):
_maintainers = models.CharField(db_column='maintainers', max_length=1024)
@property
def maintainers(self) -> List[str]:
if not self._maintainers:
return []
return self._maintainers.split(";")
@maintainers.setter
def maintainers(self, data: List[str]):
self._maintainers = ";".join(data)
或者:
class A():
@property
def data(self):
return json.loads(self._data)
@data.setter
def data(self, d):
self._data = json.dumps(d)
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。