聊聊属性方法property的用法
写之前随便百度了一下博客,又看到廖雪峰的博客了。果然置顶的能力很强。
我想说其实property的用法并不是主要用来做类型检查。反而更多应该是用于简化操作的目的。
写之前想聊一个古老的话题。年初的时候刚接触flask。当时用SQLAlchemy的Model模型去构建了一张表。在刚入门的时候,觉得仅仅是不用写SQL这么一回事
现在看来,其实SQLAlchemy的用法隐含的思想是将一个表抽象为一个对象,或者一个实体。对于实体的内容进行解读。数据库只是作为存放内容的工具而已。
初学的时候,后端要返回数据给前端。按照上面的认知,先用dbname.query.all()查出表中的所有数据。
然后就开始傻傻的写for循环。比如查出来的数据要转成字典。会在循环前定义一个空字典。每次循环用i计数器的值作为字典键值啊这种傻傻的用法。
不过不管怎么说,从功能上面来看,还是完整完成了要求。不得不说是一份不精致的答案。甚至当初因为这种思想,一直搞不清楚json值的正确用法。那是因为自己去实现了从数据到json的转换。所以不优雅,不高效。
混着混着,时间就过去了这么几个月。有些事情就是在没有思考的情况下突然想明白的。不知道是个人风格或是其他。总之现在在用这个的时候就很明确为什么要这么干而不是选择其他方法。
可能更加理解python的目的性了吧:简洁胜于高效
高不高效的事情我还没到可以讨论的阶段。上次看dict类型的实现就明白了。并没有那么多可以研习人家造出来轮子的原理的时间。先用,哪天自然就懂了
接下来简单写一下代码。
基础代码是这样:
# SQLAlchemy Model
class Tools(db.Model):
id = db.Column(db.String(100), primary_key=True)
toolname = db.Column(db.String(100))
tooldir = db.Column(db.String(100))
toolurl = db.Column(db.String(100))
tooltext = db.Column(db.String(100)) # Tool.json(demo)
[
{"toolId":1,"toolName":"工具1","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"},
{"toolId":2,"toolName":"工具2","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"},
{"toolId":3,"toolName":"工具3","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"},
{"toolId":4,"toolName":"工具4","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"},
{"toolId":5,"toolName":"工具5","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"},
{"toolId":6,"toolName":"工具6","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"}
] # Flask route restful api
@ns.route('/store')
class Store(Resource):
def get(self):
tools = Tools.query.all()
# do something to change variable name then return
return jsonify(tools)
简单介绍一下上面代码的内容。
1-7行:表的模型类
11-18行:前端给出的json文件(接口字段)
21-27行:后端接口实现(注释部分代表省略了数据处理的代码)
由于后端接口自己去写一个转换的代码,按照以前那种写法会很长。不贴出来了。自己去优化一个更无聊。(码代码久了,更喜欢偷懒了)
所以接下来贴使用property来实现的接口处理
# SQLAlchemy Model
class Tools(db.Model):
id = db.Column(db.String(100), primary_key=True)
toolname = db.Column(db.String(100))
tooldir = db.Column(db.String(100))
toolurl = db.Column(db.String(100))
tooltext = db.Column(db.String(100)) @property
def serialize(self):
series = {
'toolId': self.id,
'toolName': self.toolname,
'tooldir': self.tooldir,
'toolUrl': self.toolurl,
'toolText': self.tooltext
}
return series # Tool.json(demo)
[
{"toolId":1,"toolName":"工具1","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"},
{"toolId":2,"toolName":"工具2","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"},
{"toolId":3,"toolName":"工具3","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"},
{"toolId":4,"toolName":"工具4","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"},
{"toolId":5,"toolName":"工具5","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"},
{"toolId":6,"toolName":"工具6","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"}
] # Flask route restful api
@ns.route('/store')
class Store(Resource):
def get(self):
return jsonify([i.serialize for i in Tools.query.all()])
感觉清晰明了很多。
顺便在实现这个的过程中,也算清楚了python自带的json包的方法和flask的jsonify方法的区别是什么。
不得不说,jsonify真是偷懒的好方法。
ps:吐槽一下这狗屎代码插入器。显示在博客当中的时候会因为dom结构宽度不够直接把代码撑到行号中间去。wtf。只能删减掉一些内容了
聊聊属性方法property的用法的更多相关文章
- python-静态方法staticmethod、类方法classmethod、属性方法property
Python的方法主要有3个,即静态方法(staticmethod),类方法(classmethod)和实例方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 def ...
- 【面试必问】python实例方法、类方法@classmethod、静态方法@staticmethod和属性方法@property区别
[面试必问]python实例方法.类方法@classmethod.静态方法@staticmethod和属性方法@property区别 1.#类方法@classmethod,只能访问类变量,不能访问实例 ...
- python_面向对象——属性方法property
1.属性方法 class Student(object): def __init__(self,name): self.name = name @property #属性方法:把一个方法变成一个静态的 ...
- 初识python: 属性方法 @property
属性方法:通过@property把一个方法变成一个静态属性 实例: 调用航班的状态 # 查看航班状态 import random class CheckState(object): def __ini ...
- 面向对象【day08】:静态方法、类方法、属性方法(九)
本节内容 概述 静态方法 类方法 属性方法 总结 一.概述 前面我们已经讲解了关于类的很多东西,今天讲讲类的另外的特性:静态方法(staticmethod).类方法(classmethod).属性方法 ...
- Python 静态方法、类方法和属性方法
Python 静态方法.类方法和属性方法 静态方法(staticmethod) staticmethod不与类或者对象绑定,类和实例对象都可以调用,没有自动传值效果,Python内置函数staticm ...
- Python的程序结构[1] -> 方法/Method[1] -> 静态方法、类方法和属性方法
静态方法.类方法和属性方法 在 Python 中有三种常用的方法装饰器,可以使普通的类实例方法变成带有特殊功能的方法,分别是静态方法.类方法和属性方法. 静态方法 / Static Method 在 ...
- Python 属性方法、类方法、静态方法、 特殊属性__doc__ (内建属性)
总结:和类的关联性讲:属性方法>类方法>静态方法 属性方法@property:仅仅是调用方式不用+括号. 类方法@classmethod:访问不了累的属性变量,只可以访问类变量. 静态方法 ...
- <s:property>的用法(jsp获取action中的值或者方法)
1,访问Action值栈中的普通属性: <s:property value="attrName"/> 2,访问Action值栈中的对象属性(要有get set方法) ...
随机推荐
- Java web 引入wangEditor编辑器
最近项目需要我做些前端的事,这让我这个半吊子前端很是痛苦.项目中需要一个编辑器,之前找了个ueditor,插件比较多,需要改源码等等不说,最后弄好了,发现需要flash插件.没办法,只有推到重来,在网 ...
- 数组去重+indexOf()应用
说起数组去重大家都不陌生,去重也有好多种方法,这里介绍很好理解的两种. 第一种 首先说一下第一种的逻辑,就是先拿第一个去跟第二个比,再跟第三个比,再跟第四个比--只要发现有相等的,可以用splice( ...
- C#三步实现标准事件处理程序
事件,MSDN解释:类或对象可以通过事件向其他类或对象通知发生的相关事情.发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”. 有关事件的理论与好处,在这里就不再废话了,感兴趣的 ...
- TweenMax动画库学习
之前在做HTML5移动端开发的时候,用的都是Animate.css,这个插件封装的的确很好,但是在做一些缓动方面的动画,它也有一定的不足之处,比如手要写一个连续的动画,需要不停的去重复写函数,使得代码 ...
- MySQL GTIDs(global transaction identifiers)
1.如何定义和生成GTIDs 唯一性:在所有主从库都是唯一的,由二元组构成 每个事务和GTIDs之间都有1:1映射 GTID = source_id:transaction_id source_id标 ...
- python线程池实现多线程
参考文献 http://www.open-open.com/news/view/1c0179b http://blog.jobbole.com/52060/ 按照这个博客,实现获取多台服务器的空间使用 ...
- 前端框架对于未来web移动端的影响
现在前端框架市场比较乱,各种各样的框架参差不齐,这给我带来了很多困惑,同样是很多朋友的困惑吧!因为前端框架有很多种,对于程序员来说选择学习是非常困难的,不可能有几十上百种都要学习吧,不过最好的办法就是 ...
- 关于laravel 用paginate()取值取不到的问题
前几天在写api的时候,出现了一个比较奇怪的问题,用paginate()方法取值取不到的问题,我奇怪的是,我用paginate()方法取值是直接复制粘贴之前自己写过的api中的代码的,怎么突然取不到了 ...
- 51Nod 1284 2 3 5 7的倍数 容斥原理
1284 2 3 5 7的倍数基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注给出一个数N,求1至N中,有多少个数不是2 3 5 7的倍数. 例如N = 1 ...
- 局域网下的html注入及DNS劫持
之前研究Dsploit的部分功能实现原理,现在了解的差不多了,简要记录下Dsploit的断网攻击,html注入,图片替换,cookie劫持的原理.本篇blog需要有一定的网络知识基础在看. 假设现有三 ...