我有一个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"]
答案 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