鉴于数据字典(可能来自数据库条目),将字典的数据包装在封装类中的更正确的方法是什么,该封装类可以控制数据的设置和返回?
具体来说,我想要做的两个方法是:
dict
继承的班级“__getitem__
和__setitem__
方法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'
这两种方法都有效,在我看来,@property
装饰器更广泛地用于此类操作。但SmartContainer
类访问能力的动态性似乎对我来说更直接。 AKA smartContainer[dynamic_key]
vs smartContainer2.__getattr__(dynamic_key)
。
我想知道是否有理由使用一种方法而不是另一种方法,以及存在哪些潜在的陷阱?