使用函数编写不同的类属性

时间:2015-04-22 10:21:30

标签: python attributes

我想创建一个写入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可用)。

2 个答案:

答案 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