使用@property vs override __getitem __来操纵对象I / O更加pythonic吗?

时间:2016-01-07 16:52:32

标签: python inheritance dictionary properties

鉴于数据字典(可能来自数据库条目),将字典的数据包装在封装类中的更正确的方法是什么,该封装类可以控制数据的设置和返回?

具体来说,我想要做的两个方法是:

  1. 覆盖dict继承的班级“__getitem____setitem__方法
  2. 在标准object继承的类中,为需要控制的每个数据条目添加@property装饰器。
  3. 例如:

    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'
    

    这两种方法都有效,在我看来,@property装饰器更广泛地用于此类操作。但SmartContainer类访问能力的动态性似乎对我来说更直接。 AKA smartContainer[dynamic_key] vs smartContainer2.__getattr__(dynamic_key)

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

0 个答案:

没有答案