python tips(持续更新中)
python tips
可变对象与不可变对象
在python中,可变对象有数值类型(int,float),字符串(str),元组(tuple),可变对象有列表(list),字典(dict),集合(set)。在赋值操作中 可变对象是复制的对象本身,相当于复制了对象的指针,对赋值后的修改会修改原来的对象 例如:In [1]: b = [1,2,3,4]
In [2]: _b = b In [3]: id(_b)
Out[3]: 4519417736 In [4]: id(b)
Out[4]: 4519417736 In [5]: _b.append(6) # 修改_b,b也会跟着一起变化,因为_b和b指向的是同一个地址 In [6]: b
Out[6]: [1, 2, 3, 4, 6]
可以看出修改了_b的值,也修改了b的值,如果想仅仅修改_b的值,需要使用 _b = copy.copy(b) 而不是简单的_b = b。
对于不可变对象,对象本身的值是不能修改的,每次对其的操作都会生成一个新的对象,保存新的值。如下:
```python
In [1]: a = "sss"
In [2]: id(a)
Out[2]: 4338243040
In [3]: a += "c" # 不可变对象的赋值并不会使用同一个地址,所以id会发生变化
In [4]: id(a)
Out[4]: 4338242704
```
所以在函数中传入可变对象的时候,要小心,因为可能修改原有的对象。
元编程(metaclass)
在正常业务开发时很少使用,但在一些库中经常遇到,例如Django的ORM,其主要功能是在类初始化(不是实例化)的时候,定义一些行为和操作,代码如下import os
import numpy
import random class MetaClass(type): def __init__(self, *args, **kwargs):
print('Meta Init') def __new__(cls, name, base, attr): print('class_name is :' , name)
print(base,' is the Base *****')
print(cls.v, getattr(cls, 'b', 99 )) print('==========') del cls.v
return super(MetaClass, cls).__new__(cls, name, base, attr) class Model(metaclass=MetaClass): # python3中指定metaclass指定方式
__metaclass__ = MetaClass # python2中指定方式
MetaClass.v = 100
MetaClass.b = '-------------'
c = 9
def __new__(cls, name, base, attrs):
print('Model New---')
return super(Model, cls).__new__(cls, name, base, attrs) def __init__(self, *args, **kwargs):
self.arg = args
self.kwargs = kwargs def __str__(self):
return "test Models ----->>>>>>" class Test(metaclass=MetaClass):
__metaclass__ = MetaClass
MetaClass.v = 888 class Serial(Model):
MetaClass.v = 777 class test(Serial):
MetaClass.v = 666
在import 或者直接运行的时候,我们没有做任何类的实例化操作,但还是会有下面的打印信息,会发现,继承的每个类都运行了metaclass中的
__new__和__init__方法class_name is : Model
() is the Base *****
100 -------------
==========
Meta Init
class_name is : Test
() is the Base *****
888 -------------
==========
Meta Init
class_name is : Serial
(<class '__main__.Model'>,) is the Base *****
777 -------------
==========
Meta Init
class_name is : test
(<class '__main__.Serial'>,) is the Base *****
666 -------------
==========
Meta Init
slots
在python中,一般我们可以自由的给类,实例添加属性,然而有时候我们并不希望这样,我们需要指定的类只能有我们要求的这些属性,在这种情况下,我们引入了__slots__例如:class R(object):
"""在这个类中,我们只能添加prev,next等的属性,
当尝试添加别的的时候,会报AttributeError"""
__slots__ = 'prev', 'next', 'key', '__weakref__' class Link(R):
“”“__slots__ 不会被继承,所以在这个类中可添加指定之外的属性”“”
pass class Node(R):
"""添加了 __slots__ 之后,父类的 __slots__也会生效,此时,
限制的属性为 value, prev, next 等
"""
__slots__ = "value",
Django Queryset 切片
我们知道Django 的queryset是lazy的,只有当真正使用的时候才会去数据库取数据,并且缓存取出来的数据。
所以对于没有执行的queryset,切片操作之后仍然是queryset,执行sql之后的queryset,切片会变成list。In [2]: qs = Order.objects.all() In [3]: qs_1 = qs[10:20] In [4]: type(qs_1)
Out[4]: django.db.models.query.QuerySet In [5]: _qs = list(qs) # 会查询数据 In [6]: qs_2 = qs[10:20] In [7]: type(qs_2)
Out[7]: list
python tips(持续更新中)的更多相关文章
- Mysql注入小tips --持续更新中
学习Web安全好几年了,接触最多的是Sql注入,一直最不熟悉的也是Sql注入.OWASP中,Sql注入危害绝对是Top1.花了一点时间研究了下Mysql类型的注入. 文章中的tips将会持续更新,先说 ...
- Python奇技淫巧 - 持续更新中....
Python奇技淫巧 人生苦短,我用Python: 编程界这绝对不是一句空话,尤其是对于使用过多个语言进行工作的同学们来说,用Python的时间越长,越有一种我早干嘛去了的想法,没事,啥时候用Pyth ...
- Python开发【第二十三篇】:持续更新中...
Python开发[第二十三篇]:持续更新中...
- Pig基础学习【持续更新中】
*本文参考了Pig官方文档以及已有的一些博客,并加上了自己的一些知识性的理解.目前正在持续更新中.* Pig作为一种处理大规模数据的高级查询语言,底层是转换成MapReduce实现的,可以作为MapR ...
- Pig语言基础-【持续更新中】
***本文参考了Pig官方文档以及已有的一些博客,并加上了自己的一些知识性的理解.目前正在持续更新中.*** Pig作为一种处理大规模数据的高级查询语言,底层是转换成MapReduce实现的, ...
- 史上最全的spark面试题——持续更新中
史上最全的spark面试题——持续更新中 2018年09月09日 16:34:10 为了九亿少女的期待 阅读数 13696更多 分类专栏: Spark 面试题 版权声明:本文为博主原创文章,遵循C ...
- git常用命令(持续更新中)
git常用命令(持续更新中) 本地仓库操作git int 初始化本地仓库git add . ...
- Atom使用记录(持续更新中)
部分内容取自:http://www.jianshu.com/p/dd97cbb3c22d,我自己也在使用,持续更新中 Atom安装插件在窗口中File---Setting---install 在里面进 ...
- java视频教程 Java自学视频整理(持续更新中...)
视频教程,马士兵java视频教程,java视频 1.Java基础视频 <张孝祥JAVA视频教程>完整版[RMVB](东西网) 历经5年锤炼(史上最适合初学者入门的Java基础视频)(传智播 ...
- 系列文章:老项目的#iPhone6与iPhone6Plus适配#(持续更新中,更新日期2014年10月12日 星期日 )
本文永久地址为http://www.cnblogs.com/ChenYilong/p/4020399.html ,转载请注明出处. ********************************** ...
随机推荐
- rsync的配置
1. 安装rsync,如果要讲1.1.1.1的数据备份到2.2.2.2上,则在1.1.1.1上配置如下: /etc/rsyncd.conf uid = nobody gid = nobody use ...
- bzoj 3576: [Hnoi2014]江南乐
Description 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏. 游戏的规则是这样的,首先给定一个数F ...
- 【一】JMeter的介绍安装和使用
利用JMeter进行性能测试 一.JMeter介绍二.Jmeter安装三.工作原理四.脚本录制五.运行JMeter进行测试六.JMeter主要组件介绍七.参数化设置八.动态数据关联九.使用插件进行服务 ...
- PAT 1066 Root of AVL Tree
#include <cstdio> #include <cstdlib> class Node { public: Node* L; Node* R; int height; ...
- 设置cssrem,设置emmet
1.文件->首选项->设置 2.搜索cssrem-> 点击设置:"cssrem.rootFontSize": 16, 4.emmet
- LDA概率图模型之贝叶斯理解
贝叶斯.概率分布与机器学习 转自:http://www.cnblogs.com/LeftNotEasy/archive/2010/09/27/1837163.html 本文由LeftNotEasy原 ...
- supervisor运行virtualenv环境下的nagios-api
supervisord-example.conf [unix_http_server] file=/tmp/supervisor.sock ; path to your socket file [su ...
- 将CSV文件中的数据导入到SQL Server 数据库中
导入数据时,需要注意 CSV 文件中的数据是否包含逗号以及双引号,存在时,导入会失败 选择数据库 -> 右键 -> 任务 -> 导入数据 ,然后根据弹出的导入导出向导(如下图)中的提 ...
- day007-线程池、Lambda
1. 线程池 就好生活中的游泳池,可以容纳多人在池子里游泳.戏水.线程池里可以有多个正在运行的线程,同时执行已经提交了的多个任务. 什么是线程池?一个用来创建和管理线程的容器. 线程池的原理 线程复用 ...
- 在浏览器的市场上,IE依然是放弃了,firefox还在继续~~
自从微软失败后,发布了Edge:但是依然是没有多少市场的,毕竟各种难受: 单从开发者工具,我是没有其它选择了, ie的不能用,https://www.microsoft.com/en-us/welco ...