聊聊属性方法property的用法

 写以前随便百度了一下博客,又看到廖雪峰的博客了。果真置顶的能力很强。前端

我想说其实property的用法并非主要用来作类型检查。反而更多应该是用于简化操做的目的。python

 

写以前想聊一个古老的话题。年初的时候刚接触flask。当时用SQLAlchemy的Model模型去构建了一张表。在刚入门的时候,以为仅仅是不用写SQL这么一回事数据库

如今看来,其实SQLAlchemy的用法隐含的思想是将一个表抽象为一个对象,或者一个实体。对于实体的内容进行解读。数据库只是做为存放内容的工具而已。json

 

初学的时候,后端要返回数据给前端。按照上面的认知,先用dbname.query.all()查出表中的全部数据。flask

而后就开始傻傻的写for循环。好比查出来的数据要转成字典。会在循环前定义一个空字典。每次循环用i计数器的值做为字典键值啊这种傻傻的用法。后端

不过无论怎么说,从功能上面来看,仍是完整完成了要求。不得不说是一份不精致的答案。甚至当初由于这种思想,一直搞不清楚json值的正确用法。那是由于本身去实现了从数据到json的转换。因此不优雅,不高效。api

 

混着混着,时间就过去了这么几个月。有些事情就是在没有思考的状况下忽然想明白的。不知道是我的风格或是其余。总之如今在用这个的时候就很明确为何要这么干而不是选择其余方法。restful

可能更加理解python的目的性了吧:简洁胜于高效dom

 

高不高效的事情我还没到能够讨论的阶段。上次看dict类型的实现就明白了。并无那么多能够研习人家造出来轮子的原理的时间。先用,哪天天然就懂了工具

 

接下来简单写一下代码。

基础代码是这样:

 

 1 # SQLAlchemy Model
 2 class Tools(db.Model):
 3     id = db.Column(db.String(100), primary_key=True)
 4     toolname = db.Column(db.String(100))
 5     tooldir = db.Column(db.String(100))
 6     toolurl = db.Column(db.String(100))
 7     tooltext = db.Column(db.String(100))
 8 
 9 
10 # Tool.json(demo)
11 [
12     {"toolId":1,"toolName":"工具1","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"},
13     {"toolId":2,"toolName":"工具2","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"},
14     {"toolId":3,"toolName":"工具3","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"},
15     {"toolId":4,"toolName":"工具4","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"},
16     {"toolId":5,"toolName":"工具5","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"},
17     {"toolId":6,"toolName":"工具6","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"}
18 ]
19 
20 
21 # Flask route restful api
22 @ns.route('/store')
23 class Store(Resource):
24     def get(self):
25         tools = Tools.query.all()
26         # do something to change variable name then return
27         return jsonify(tools)

 

简单介绍一下上面代码的内容。

1-7行:表的模型类

11-18行:前端给出的json文件(接口字段)

21-27行:后端接口实现(注释部分表明省略了数据处理的代码)

因为后端接口本身去写一个转换的代码,按照之前那种写法会很长。不贴出来了。本身去优化一个更无聊。(码代码久了,更喜欢偷懒了)

 

因此接下来贴使用property来实现的接口处理

 1 # SQLAlchemy Model
 2 class Tools(db.Model):
 3     id = db.Column(db.String(100), primary_key=True)
 4     toolname = db.Column(db.String(100))
 5     tooldir = db.Column(db.String(100))
 6     toolurl = db.Column(db.String(100))
 7     tooltext = db.Column(db.String(100))
 8 
 9     @property
10     def serialize(self):
11         series = {
12             'toolId': self.id,
13             'toolName': self.toolname,
14             'tooldir': self.tooldir,
15             'toolUrl': self.toolurl,
16             'toolText': self.tooltext
17         }
18         return series
19 
20 
21 # Tool.json(demo)
22 [
23     {"toolId":1,"toolName":"工具1","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"},
24     {"toolId":2,"toolName":"工具2","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"},
25     {"toolId":3,"toolName":"工具3","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"},
26     {"toolId":4,"toolName":"工具4","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"},
27     {"toolId":5,"toolName":"工具5","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"},
28     {"toolId":6,"toolName":"工具6","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"}
29 ]
30 
31 
32 # Flask route restful api
33 @ns.route('/store')
34 class Store(Resource):
35     def get(self):
36         return jsonify([i.serialize for i in Tools.query.all()])

 

感受清晰明了不少。

顺便在实现这个的过程当中,也算清楚了python自带的json包的方法和flask的jsonify方法的区别是什么。

不得不说,jsonify真是偷懒的好方法。

 

ps:吐槽一下这狗屎代码插入器。显示在博客当中的时候会由于dom结构宽度不够直接把代码撑到行号中间去。wtf。只能删减掉一些内容了

相关文章
相关标签/搜索