在python中向getter发送参数:这是一个可接受的解决方案吗?

时间:2013-12-23 15:04:44

标签: python properties getter getter-setter

为了便于讨论,我想说我想从dictionary写入和读取值,但我想在字典键中附加一些字符串。我希望将其隐藏在settergetter方法中,而不是让用户进行字符串操作。这对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'))

我已经搜索了适合我需要的settergetter的方法,但我所看到的只是人们声称Python不需要它们而且我们都应该只是成年人并直接访问属性。我发现的最接近的是question,但我发现我的解决方案更直接。

2 个答案:

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