我知道在python中使用getter和setter不是pythonic。而应该使用属性修饰符。但我想知道以下情况 -
我有一个用几个实例属性初始化的类。然后我需要在类中添加其他实例属性。如果我不使用setter,那么我必须在课堂外的任何地方写object.attribute = value
。该课程不会有self.attribute
代码。当我需要跟踪类的属性时,这会不会成为一个问题(因为它们散布在类外的代码中)?
答案 0 :(得分:4)
通常,您甚至不应该使用属性。在绝大多数情况下,简单属性都可以正常工作:
>>> 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
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
如果您还需要能够分配属性,那么定义一个setter很简单:
>>> x = X()
>>> x.a
Traceback (most recent call last):
# ... etc
AttributeError: 'X' object has no attribute '_a'
>>> x.a = 'foo'
>>> x.a
'foo'
{{1}}
请注意,在每种情况下,客户端代码访问属性或属性的方式都完全相同。没有必要为你的课程“面向未来”,反对在某些时候你可能想要做一些比简单的属性访问更复杂的事情的可能性,所以没有理由写属性,getter或setter 除非你真的需要它们现在
有关属性,getter和setter的惯用Python和其他语言之间差异的更多信息,请参阅: