标签:properties python-3-x getter-setter python
我知道在python中使用getter和setters不是pythonic.应该使用属性装饰器.但是我想知道以下情况-
我有一个用一些实例属性初始化的类.然后,稍后我需要向该类添加其他实例属性.如果不使用设置器,则必须在类外的任何地方编写object.attribute = value.该类将没有self.attribute代码.当我需要跟踪类的属性时(因为它们散布在类外部的代码中),这不会成为问题吗?
解决方法:
通常,您甚至都不应该使用属性.简单属性在大多数情况下都可以正常工作:
class X:
pass
>>> x = X()
>>> x.a
Traceback (most recent call last):
# ... etc
AttributeError: 'X' object has no attribute 'a'
>>> x.a = 'foo'
>>> x.a
'foo'
只有在访问属性时需要做一些工作时,才应使用属性:
import random
class X:
@property
def a(self):
return random.random()
>>> x = X()
>>> x.a
0.8467160913203089
如果还需要能够分配给属性,则定义一个setter很简单:
class X:
@property
def a(self):
# do something clever
return self._a
@a.setter
def a(self, value):
# do something even cleverer
self._a = value
>>> x = X()
>>> x.a
Traceback (most recent call last):
# ... etc
AttributeError: 'X' object has no attribute '_a'
>>> x.a = 'foo'
>>> x.a
'foo'
请注意,在每种情况下,客户端代码访问属性或属性的方式都是完全相同的.无需为类提供“面向未来的”功能,以免在某些时候您可能想要做的事情比简单的属性访问更为复杂,因此除非您现在确实需要它们,否则没有理由编写属性,getter或setter.
有关特性,getter和setter的惯用Python与其他语言之间的区别的更多信息,请参见:
> Why don’t you want getters and setters?
> Python is not Java(尤其是“字母和字母的设置是邪恶的”部分)
标签:properties,python-3-x,getter-setter,python 来源: https://codeday.me/bug/20191026/1933123.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。