我想知道在使用Python中的OPP / Classes / Instances时,我应该总是使用 getAttr()/ setAttr()来读取 - 从类的属性/变量。或直接处理变量/属性(例如self.my_attr =“some_value”)会是更好的做法吗?
class MyClass(object):
def __init__(self):
super(MyClass, self).__init__()
self.my_attr = 'My_Value'
def doSomething(self):
localVariable = self.my_attr
print localVariable
class MyClass(object):
def __init__(self):
super(MyClass, self).__init__()
self.my_attr = 'My_Value'
def getMyAttr(self):
return self.my_attr
def doSomething(self):
localVariable = self.my_attr
print localVariable
阅读“面向对象的思维过程”一书(Matt Weisfeld:开发人员的图书馆)......作者在整个过程中不断说明:
“...对象内的属性访问应该由对象控制 本身 - 没有其他对象应该直接更改另一个对象的属性......“
“...如果你控制对属性的访问,当出现问题时,你就可以了 不必担心跟踪可能已经改变的每一段代码 属性 - 它只能在一个地方(设置者)改变......“
然后我会坚持使用二传手和吸气剂。这里建议/提到Python的@property和@ .setter使它更容易。
答案 0 :(得分:10)
您应该直接访问变量。
如果您随后需要添加一些逻辑来获取/设置值,请将其转换为property
。
答案 1 :(得分:7)
而不是后一个示例,请考虑使用@property
装饰器。
class MyClass(object):
def __init__(self):
super(MyClass, self).__init__()
self.__my_attr = 'My_Value'
@property
def my_attr(self):
return self.__my_attr
def doSomething(self):
localVariable = self.__my_attr
print localVariable
只有在您有充分的理由保护会员时才使用它,例如如果你想验证它的值:
class Person:
@property
def age(self): return self.__age
@age.setter
def age(self, value):
if value < 0: raise Exception('Age out of bounds.')
self.__age = value
p = Person ()
p.age = 14
print (p.age)
p.age = -34