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(持续更新中)的更多相关文章

  1. Mysql注入小tips --持续更新中

    学习Web安全好几年了,接触最多的是Sql注入,一直最不熟悉的也是Sql注入.OWASP中,Sql注入危害绝对是Top1.花了一点时间研究了下Mysql类型的注入. 文章中的tips将会持续更新,先说 ...

  2. Python奇技淫巧 - 持续更新中....

    Python奇技淫巧 人生苦短,我用Python: 编程界这绝对不是一句空话,尤其是对于使用过多个语言进行工作的同学们来说,用Python的时间越长,越有一种我早干嘛去了的想法,没事,啥时候用Pyth ...

  3. Python开发【第二十三篇】:持续更新中...

    Python开发[第二十三篇]:持续更新中...

  4. Pig基础学习【持续更新中】

    *本文参考了Pig官方文档以及已有的一些博客,并加上了自己的一些知识性的理解.目前正在持续更新中.* Pig作为一种处理大规模数据的高级查询语言,底层是转换成MapReduce实现的,可以作为MapR ...

  5. Pig语言基础-【持续更新中】

      ***本文参考了Pig官方文档以及已有的一些博客,并加上了自己的一些知识性的理解.目前正在持续更新中.***   Pig作为一种处理大规模数据的高级查询语言,底层是转换成MapReduce实现的, ...

  6. 史上最全的spark面试题——持续更新中

    史上最全的spark面试题——持续更新中 2018年09月09日 16:34:10 为了九亿少女的期待 阅读数 13696更多 分类专栏: Spark 面试题   版权声明:本文为博主原创文章,遵循C ...

  7. git常用命令(持续更新中)

    git常用命令(持续更新中) 本地仓库操作git int                                 初始化本地仓库git add .                       ...

  8. Atom使用记录(持续更新中)

    部分内容取自:http://www.jianshu.com/p/dd97cbb3c22d,我自己也在使用,持续更新中 Atom安装插件在窗口中File---Setting---install 在里面进 ...

  9. java视频教程 Java自学视频整理(持续更新中...)

    视频教程,马士兵java视频教程,java视频 1.Java基础视频 <张孝祥JAVA视频教程>完整版[RMVB](东西网) 历经5年锤炼(史上最适合初学者入门的Java基础视频)(传智播 ...

  10. 系列文章:老项目的#iPhone6与iPhone6Plus适配#(持续更新中,更新日期2014年10月12日 星期日 )

    本文永久地址为http://www.cnblogs.com/ChenYilong/p/4020399.html ,转载请注明出处. ********************************** ...

随机推荐

  1. git本地创建新分支并推送到远程仓库

    1,在当前项目目录,从已有的分支创建新的分支(如从master分支),创建一个dev分支 git checkout -b dev 2,创建完可以查看一下,分支已经切换到dev git branch * ...

  2. C# 获取字符串长度

    int leng = System.Text.Encoding.Default.GetBytes(attachfileId2).Length;

  3. nodejs 实践:express 最佳实践(四) express-session 解析

    nodejs 实践:express 最佳实践(四) express-session 解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs ...

  4. .net Ioc 之 Unity 适合刚开始使用

    介绍: 首先稍微介绍一下,Unity是微软patterns& practices组用C#实现的轻量级.可扩展的依赖注入容器,可通过代码或xml配置文件来配置对象之间的关系.那么通过一个简单的代 ...

  5. 如何用dva来构建你的应用

    dva的github地址: https://github.com/dvajs/dva-knowledgemap#%E9%80%9A%E8%BF%87-connect-%E7%BB%91%E5%AE%9 ...

  6. Android上使用RecyclerView实现顶部悬浮标题效果的Sticky Title View

    目前很多的项目都在使用顶部悬浮标题的效果,很明显,这的确是一个比较人性化,用户体验效果比较好的UI交互效果,对于这个效果,有很多种实现方式,如果说要用RecyclerView来实现一个分类信息展示,并 ...

  7. ANR android

    1.android ANR产生原因和解决办法 2.Android ANR异常及解决方法 3.Android ANR 分析解决方法 4.[原创]Android 系统稳定性 - ANR(一) 5.[原创] ...

  8. 【转】dB的计算方法

    原文地址:https://www.espressif.com/zh-hans/media/blog/%E5%A2%9E%E7%9B%8A%E6%AF%94%E5%80%BC-db-%E4%BB%A5% ...

  9. ORACLE查询删除重复记录三种方法

    本文列举了3种删除重复记录的方法,分别是rowid.group by和distinct,小伙伴们可以参考一下.   比如现在有一人员表 (表名:peosons) 若想将姓名.身份证号.住址这三个字段完 ...

  10. C#实现文件异步上传

    //前台方法,包含弹出框确认以及文件选择<input type="button" id="importxlsx" name="importxls ...