我可以为get和set以外的操作指定python访问器方法吗?

时间:2015-01-25 00:51:33

标签: python getter-setter

我有一个python类A,其属性为instance_b,如下所示:

class A(object):

    instance_b = 0

    def getB(self):
        # Do something Fancy here
        return self.instance_b

    def setB(self, value):
        # Do something Fancy here
        self.instance_B = value

    b = property(getB, setB)

property()函数允许我指定一个getter和setter。但有没有办法可以指定增量和减量器?我可以为其他操作指定类似的方法吗?

更重要的是,如果instance_b是一个列表而不是一个整数,该怎么办?我可以设置替代“.insert()”和“+ =”和“[ - 1]”的方法吗?

或者只允许指定getter和setter(和删除).....我必须使用它们来做我需要的事情。因此,在列表instance_b中添加一个元素需要看起来像这样吗?

a = A()
a.b = a.b + ["my_item"]

2 个答案:

答案 0 :(得分:0)

“如果instance_b是一个列表而不是一个整数”,你可以在getB返回后很好地调用list方法。如果你需要拦截一些列表方法(或运算符,& c),那么你需要将包含在你自己的类中的列表返回给拦截。

所以简单的情况可能是......:

class A(object):

    instance_b = []

    def getB(self):
        # Do something Fancy here
        return self.instance_b

    def setB(self, value):
        # Do something Fancy here
        self.instance_B = value

    b = property(getB, setB)

现在举例:

a = A()
a.b.append(23)
print(a.b)

按预期显示[23]

现在假设出于你自己的原因,你希望append上的a.b行动两次(而其他列表方法正常工作,你不关心运营商)。这需要一个简单的包装类:

class Double(object):
    def __init__(self, alist):
        self.alist = alist

    def append(self, v):
        self.alist.extend((v,v))

    def getattr(self, n):
        return getattr(self.alist, n)

    def __str__(self):
        return str(self.alist)

并将getB更改为return Doubt(self.instance_B)。现在,与之前相同的代码显示[23, 23] - 再次按预期显示。

拦截操作员也很有可能,只是有点费力,我会把它作为练习留给感兴趣的读者: - )。

答案 1 :(得分:0)

如果您修复了代码中的错误,那么使用基本getter和setter方法的property函数将允许您执行您提到的所有操作:

class A(object):

    instance_b = 0

    def getB(self):
        # Do something Fancy here
        return self.instance_b

    def setB(self, value):
        # Do something Fancy here
        self.instance_b = value  # <-- this line in your code was wrong

    b = property(getB, setB)

a = A()
print(a.b)               # --> 0
a.b += 42
print(a.b)               # --> 42
a.b = []                 # replace with an empty list
print(a.b)               # --> []
a.b = a.b + ["my_item"]
print(a.b)               # --> ['my_item']
a.b.insert(0, 23)
print(a.b)               # --> [23, 'my_item']
print(a.b[-1])           # --> my_item