python - 为什么我们在 python 中需要属性/getter/setter?
问题描述
只想了解python中的属性/getter/setter。手头有两个问题,能帮忙回答一下吗?谢谢。
通过几个线程,基本知识是我们可以使用 getter/setter 将一些属性设为私有,然后通过使用属性,我们可以像 public 一样使用这些属性。那么为什么我们需要这个?因为原来
__init__
是公开的几个线程给了我们一个例子,我们可以在 setter 中添加值约束。我的问题是为什么我们
__init__
不像下面的代码那样直接在里面添加约束?
class test1:
def __init__(self, num):
if type(num) == int:
self.num = num
else:
raise TypeError('we need int')
解决方案
你一开始就不需要它们——正如你所写的,你可以只使用实例变量:
def __init__(self):
self.the_answer = 42
但是,如果您稍后将实现更改为使用函数而不是变量,则可以将其更改为:
def __init__(self):
self._the_answer = None
@property
def the_answer(self):
if self._the_answer is None:
self._the answer = self.calculate_answer()
return self._the_answer
无需更改 API。在此示例中,它使用惰性求值来仅在访问时进行计算,但在许多其他情况下这可能会有所帮助:
- 从多个变量计算属性值,因此不需要单个变量
- 向设置器添加约束以仅允许设置某些值
- 不要添加设置器以具有只读属性
- 使某些事件的值无效并仅在这种情况下重新计算它们
- 覆盖子类中属性的行为
推荐阅读
- python - 为什么可以在类中同时覆盖 __eq__ 和 __ne__ ?
- java - 根据驱动程序类型在运行时选择页面对象类
- java - @OneToOne 与三个表之间的共享密钥
- android - 自定义 AutoCompleteTextView 不工作是 android 版本 6.0.1,但它在旧版本上正常工作
- php - 获取作为数组加入的结果
- html - 居中联系表格内容
- ios - 点击时更改 UICollectionViewCell 内的视图不起作用
- xslt - 针对多个正则表达式测试字符串
- node.js - 如何根据查询参数不同的html文件
- git - 无法解决 git rebase 问题