为了便于讨论,我想说我想从dictionary
写入和读取值,但我想在字典键中附加一些字符串。我希望将其隐藏在setter
和getter
方法中,而不是让用户进行字符串操作。这对Python setter
方法没有任何问题,因为我可以发送一个包含可以解析的信息的列表。但是,它不适用于getter
方法,因为参数无法发送到getter
。我编写了下面显示的解决方法,其中getter
返回一个函数,该函数接受参数并执行我想要的操作。我只是想知道这个可接受的Python是否会让我后悔使用这种方法。
class tester(object):
def __init__(self):
self._dict = {}
def _set(self,some_list):
self._dict.update({some_list[0]+'_'+some_list[1]: some_list[2]})
def _get(self):
return self._func
def _func(self,key1,key2):
keys = key1+'_'+key2
return self._dict[keys]
props = property(_get, _set)
a = tester()
value = [1,2,3,4,5]
a.props = ('main_key','sub_key',value)
print(a.props('main_key','sub_key'))
我已经搜索了适合我需要的setter
和getter
的方法,但我所看到的只是人们声称Python不需要它们而且我们都应该只是成年人并直接访问属性。我发现的最接近的是question,但我发现我的解决方案更直接。
答案 0 :(得分:2)
属性(或任何其他描述符)用于计算属性,即具有属性的语义但需要在set和/或get上进行某些计算的成员。通过“属性的语义”,我的意思是从客户端的代码中写出:
something = obj.attribute
和/或
obj.attribute = something_else
一旦你必须将参数传递给getter或者setter的多个参数,它显然没有attribute
语义,所以你不能使用computed属性。解决方案很简单:使用显式的getter / setter对。
关于Python中不需要getter / setter的观点是对于任何具有属性语义(但不是其他任何东西)的东西,如果和何时你都可以将直接属性访问权限转换为计算对象你需要它而不破坏客户端代码。那显然不是你的情况。
tl; dr:滥用属性你的方式不是pythonic,你会更好地使用显式getter和setter。
答案 1 :(得分:1)
以下是使用__getitem__
和__setitem__
:
class tester(object):
class Subelement(object):
def __init__(self, obj, key):
self.obj = obj
self.key = key
def __getitem__(self, subkey):
return self.obj._dict[self.key + '_' + subkey]
def __setitem__(self, subkey, value):
self.obj._dict[self.key + '_' + subkey] = value
def __init__(self):
self._dict = {}
def __getitem__(self, key):
return Subelement(self, key)