习惯了java的setter、getter,在python中,也这样写。
class Tag(object):
def __init__(self,**kwargs):
if kwargs.has_key('title'):
self.title = kwargs['title']
def get_title(self):
return self._id
def set_title(self,title):
self.title=title
当属性多了之后,这样写,代码量很多。并且,在pycharm中,并没有找到像eclipse那样的自动生成getter、setter代码的快捷键,耗时长,并且代码长,不美观。改成下面这种形式,即可。
class Tag(object):
def __init__(self,**kwargs):
for (key,value) in kwargs.iteritems():
if key is not None and value is not None:
#setattr(key,value)
self.__setattr__(key,value)
def __getattribute__(self, name):
return super(Tag, self).__getattribute__(name)
def __setattr__(self, name, value):
super(Tag, self).__setattr__(name, value)
def __getitem__(self, attr):
return super(Tag, self).__getattribute__(attr)
if __name__ == "__main__":
tag = Tag(title='12344')
print tag.title
print tag['title']
# error:对象,不能用in来判断是否包含属性
#if 'title' in tag:
# print "in"
#else:
# print "not in"
if hasattr(tag, 'title'):
print "has"
else:
print "not has"
tag1=Tag1(title='4321')
print tag1.title
# error:对象,不能用in来判断是否包含属性
#print tag1['title']
#if 'title' in tag1:
# print "in"
#else:
# print "not in"
if hasattr(tag1, 'title'):
print "has"
else:
print "not has"
"""
# 将文件读取到list中
file = "data/tag.json"
list=None
with open(file, 'r') as fb:
list = json.load(fb)
"""
json_str='[{"title": "t1"},{"title": "t2"}]'
list = json.loads(json_str)
for i, val in enumerate(list):
if 'title' in val:
print "in"
else:
print "not in"
判断对象里是否包含属性,使用hasattr(object, 'property')进行判断。另外,由于python是弱类型,使用json加载到list之后,list里面的每一个元素就是dictionary的类型了,这时候,就使用in判断是否包含于keys里面,就不能使用hasattr(object, 'property')来判断。
dict.get('property',value) 当dict中存在属性property,就取出其值;当不存在属性property,就是默认值“value”。
对于object类型,只要定义中有了字段field,那么obj.field1就是取这个字段当值,当没有对此字段进行设值的话,那么就是默认值None
网友评论