我想创建一个写入Python类中的属性的函数,但是能够决定是否应该写入该属性。
class Test(object):
def __init__(self):
self.a = None
self.b = None
def write_attrib(self,which_attrib,value):
# perform a check here
which_attrib = value
def write_a(self,value):
self.write_attrib(self.a, value)
def write_b(self,value):
self.write_attrib(self.b, value)
if __name__ == '__main__':
t = Test()
t.write_a(5)
t.write_b(4)
print(t.a, t.b)
现在这将导致两个值都为None
,因此函数没有触及它们。
我想做这种方法所以我可以在写write_attrib
之前进行一些检查,然后我就不必编写这些检查两次了(但是想做一些便利函数{{1} }}和write_a
可用)。
答案 0 :(得分:3)
要构建我的评论,您可以实现__setattr__
仅验证您指定的属性:
class Test(object):
VALIDATED = {'a', 'b'}
def __init__(self):
self.a = None
self.b = None
def __setattr__(self, attr, val):
if attr in self.VALIDATED:
pass # add your checking
super(Test, self).__setattr__(attr, val)
或者,您可以为要验证的属性实施@property
,管理对私有约定属性的访问(标识符中带有前导下划线):< / p>
class Test(object):
def __init__(self):
self.a = None
self.b = None
@property
def a(self):
return self._a
@a.setter
def a(self, val):
# add your checking here
self._a = val
@property
def b(self):
return self._b
@b.setter
def b(self, val):
# add your checking here
self._b = val
如果您有许多具有相同验证规则的属性,前者可能更整洁,后者如果您拥有更少的属性和/或每个属性的验证规则不同。两者都允许您具有干净的属性访问权限,无需getter或setter(参见例如Python @property versus getters and setters)。
答案 1 :(得分:1)
使用property
class Test(object):
def __init__(self):
self._a = None
@property:
def a(self):
return self._a
@a.setter
def a(self, value):
# Do your validation here
self._a = value