用@property vs override\uu getitem\操纵对象I/O是否更像python?

2024-06-09 18:48:29 发布

您现在位置:Python中文网/ 问答频道 /正文

假设有一个数据字典(可能来自数据库条目),用什么更正确的方法将该字典的数据包装在一个封装类中,该类可以控制数据可以设置为什么并作为什么返回?你知道吗

具体来说,我想到的两种方法是:

  1. 重写dict继承的类__getitem____setitem__方法
  2. 在标准的object继承类中,为每个需要控制的数据项添加@property装饰器。你知道吗

例如:

class SmartContainer(dict):

    ## Format/check items as they are returned
    def __getitem__(self,key):
        if key == "birthday":
            return "Happy Birthday!{bdate}".format(bdate=self.get('birthday'))
        if key not in self.keys():
            return 0

    def __init__(self,baseDict):
        super(SmartContainer,self).__init__(baseDict)

class SmartContainer2(object):
    @property
    def birthday(self):
        return "Happy Birthday! {bdate}".format(bdate=self._birthday)
    @birthday.setter
    def birthday(self,value):
        self._birthday = value

    def __init__(self, baseDict):
        [self.__setattr__(k,v) for k,v in baseDict.iteritems()]

在这个纯粹的任意示例中,我有两个类实现了每个体系结构。你知道吗

smartContainer=SmartContainer({"pi":3.14, "birthday":"01/01/2016"})
smartContainer['birthday'] 
>>>'Happy Birthday! 01/01/2016'

smartContainer2=SmartContainer2({"pi":3.14, "birthday":"01/01/2016"})
smartContainer2.birthday 
>>>'Happy Birthday! 01/01/2016'

两种方法都有效,在我看来,@propertydecorator更广泛地用于此类操作。但是SmartContainer类访问能力的动态特性对我来说似乎更为直接。又名smartContainer[dynamic_key]smartContainer2.__getattr__(dynamic_key)。你知道吗

我想知道是否有理由使用一种方法而不是另一种方法,以及存在哪些潜在的陷阱?你知道吗


Tags: 数据方法keyselfreturninitdefbirthday