alp*_*ric 1 python methods class instance attr
我想知道在使用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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
阅读"面向对象思想过程"一书(Matt Weisfeld:开发人员图书馆)......作者在其中不断说明:
"......对象内部属性的访问应该由对象本身控制 - 没有其他对象应该直接更改另一个对象的属性......"
"...如果您控制对属性的访问,当出现问题时,您不必担心跟踪可能已更改属性的每一段代码 - 它只能在一个地方更改(设置者) ......"
那时我会坚持使用二传手和吸气剂.这里建议/提到Python的@property和@ .setter使它更容易.
而不是后一个例子,考虑使用@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
Run Code Online (Sandbox Code Playgroud)
仅在您有充分理由保护该成员时才使用它,例如,如果您想验证其值:
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
Run Code Online (Sandbox Code Playgroud)