——看到哪里。想到哪里,记到哪里

非常多时候。非常多人学python的时候,会忽略的东西非常多。大多数都盯着能“出货”即可,可是通常在读别人的代码的时候发现,看不懂。。。一方面是自己的代码技巧和经验不足;还有一方面就是自己掌握的东西不全面。而这些往往是基础的东西。还不算高大上的东西。。

第一:动态实例属性

Python的类,面向对象的东西和其它语言不太一样。比方实例的属性是能够动态分配的。本来没有的。能够自己加上,就算类中未定义,也能够用,挺方便的。可是建议能一次行定义完整最好,以下举个粒子:

>>> class Address(object):
... def __init__(self,name,phone):
... self.name = name
... self.phone = phone
...
>>> jhon = Address('Jhon dov','123456')
>>> jhon.name
'Jhon dov'
>>> jhon.phone
'123456'
>>> jhon.wa = 'aaa'
>>> print jhon.wa
aaa

jhon.wa这个,就是实例属性的动态分配。原来类中未定义wa属性,可是我们能够通过jhon实例创建一个。

第二,可变不可变,传引用传值

究竟传值还是传引用。。

有时候会乱,那是由于理解不深刻啊。python中还是非常好区分的,举个粒子:

>>> list1 = [1,'a',['foo','bar'],('cc','opo')]
>>> list2 = list1
>>> list2[0]
1
>>> list2[2]
['foo', 'bar']
>>> list2[3]
('cc', 'opo')
>>> list2[3][0]
'cc'
>>> list2[0] = 2
>>> list2[2][0] = 'wang'
>>> list1
[2, 'a', ['wang', 'bar'], ('cc', 'opo')]
>>> list2
[2, 'a', ['wang', 'bar'], ('cc', 'opo')]
>>> list1[3][0] = 'dd'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

能够看出来。直接赋值的这样的传的是引用,就是说list1、list2指向的是内存中同样的地方,就像一个人取了俩名字,这点还是非常好理解的

再来个栗子:

>>> alist = list(list1)
>>> alist
[2, 'a', ['wang', 'bar'], ('cc', 'opo')]
>>> list1
[2, 'a', ['wang', 'bar'], ('cc', 'opo')]
>>> alist[0] = 3
>>> alist[1] = 'Z'
>>> alist[2][1] = "rab"
>>> alist[3][0] = "111"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> alist[3] = ['1','2','3']
>>> alist
[3, 'Z', ['wang', 'rab'], ['1', '2', '3']]
>>> list1
[2, 'a', ['wang', 'rab'], ('cc', 'opo')]

这次不是直接赋值,可是一開始我们比較alist和list1,发现内容一样的。往下看,当对alist中的前两个元素更改的时候,最后与list1不一样了,list1的前两个元素没变。alist变了,这是由于前两个元素,一个是整数一个是字符串,都是不可变的。所以,alist中的前两个元素事实上是list1前两个元素的传值的效果。就是说两者仅仅是值同样,内存中有两份。可是内存中的位置不一样,所以更改alist中的前两个元素时。不影响list1中的;再看list1中的['wang','bar']。这本身就是个列表,我们知道,列表是可变的,所以在python中。这个列表传的是引用。内存中仅仅有一份,所以,改变alist中的这个列表,list1中的也会改变,最后演示了一下。列表中的元组,元组本身不可变,所以更改元组中内容会报错,且传递的是值,可是这个元组作为一个列表中的元素,我们能够总体替换掉。

可能说的比較乱,自己动手试试就知道了,这就是一个“浅拷贝”和“深拷贝”问题,浅拷贝顾名思义,拷贝的非常浅,能够理解为倒卖指针的家伙,同喝一杯饮料,就是传引用。再详细点的栗子就是,借别人一个东西。无论怎么借,东西就是一个,不会自己添加,假设有人把借的东西用坏了,那就真坏了;深拷贝,传值,每一个人一杯饮料。举个栗子就是,你看见别人一个杯子非常好看,你也想有一个。于是你也买了一个一样的杯子,两个杯子是一样的,可是所属人不一样,假设你不小心把杯子弄啐了,别人的杯子是不可能也跟着坏的。。。

第三,字符串抑制转义

新手一開始在读别人代码的时候,特别是读写文件那部分,总会遇到转义的问题,还有不明确转义是什么的也不在少数。照猫画虎的也有。真正理解事实上非常easy就是‘\’与其它字符拼在一起的时候。会变成其它的含义,下图给了几个样例

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcmVjc3lzbWw=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

另一个明显且常见的,file = open('C:\new\text.dat','w'),我们觉得这是打开此文件夹下的dat文件。可是这样不行,由于\n是换行符,\t是制表符。那怎么解决?

一个通用的方法就是:字符串抑制转义,使用方法如:

file = open(r'C:\new\text.dat','w')

解释:假设r(大写或者小写)出如今字符串的第一个引號的前面,将会自己主动关闭转义机制

还能够这样解决:

file = open('C:\\new\\text.dat','w')

事实上这两种方式基本一样,如:

>>> path = r'C:\new\text.dat'
>>> path
'C:\\new\\text.dat'
>>> print path
C:\new\text.dat
>>>

版权声明:本文博客原创文章,博客,未经同意,不得转载。

Python缺乏调查的陷阱 动态实例属性、引用、逃生的更多相关文章

  1. Python 进阶_OOP 面向对象编程_实例属性和方法

    目录 目录 构造器和解构器 构造器 __init__ 真构造器 __new__ 解构器 __del__ 实例方法 Python 中的 抽象方法 实例属性 查看实例属性 实例属性和类属性的区别 访问不可 ...

  2. python面向对象编程(2)—— 实例属性,类属性,类方法,静态方法

    1  实例属性和类属性 类和实例都是名字空间,类是类属性的名字空间,实例则是实例属性的名字空间. 类属性可通过类或实例来访问.只有通过类名访问时,才能修改类属性的值. 例外的一种情况是,当类属性是一个 ...

  3. Python基础:17类和实例之一(类属性和实例属性)

    1:类通常在一个模块的顶层进行定义.对于Python来说,声明与定义类是同时进行的. 2:类属性仅与其类相绑定,类数据属性仅当需要有更加“静态”数据类型时才变得有用,这种属性是静态变量.它们表示这些数 ...

  4. 2015/9/20 Python基础(16):类和实例

    面向对象编程编程的发展已经从简单控制流中按步的指令序列进入到更有组织的方式中,依靠代码块可以形成命名子程序和完成既定的功能.结构化的或过程性编程可以让我们把程序组织成逻辑快,以便重复或重用.创造程序的 ...

  5. 第8.20节 Python中限制动态定义实例属性的白名单:__slots__

    一. 引言 按照<第7.10节 Python类中的实例变量定义与使用>.<第7.14节Python类中的实例方法解析>中的介绍,当定义了一个类,并且创建了该类的实例后,可以给该 ...

  6. Python 类的属性和实例属性 Python 的动态语言

    #定义一下类, 含有类属性 aaa, >>> class Aa: ... aaa = 10... #对类 Aa实例化出一个实例 a1>>> a1 = Aa() &g ...

  7. 【Python】[面性对象编程] 获取对象信息,实例属性和类属性

    获取对象信息1.使用isinstance()判断class类型2.dir() 返回一个对象的所有属性和方法3.如果试图获取不存在的对象会抛出异常[AttributeError]4.正确利用对象内置函数 ...

  8. python基础——实例属性和类属性

    python基础——实例属性和类属性 由于Python是动态语言,根据类创建的实例可以任意绑定属性. 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Student(objec ...

  9. Python的类实例属性访问规则

    一般来说,在Python中,类实例属性的访问规则算是比较直观的. 但是,仍然存在一些不是很直观的地方,特别是对C++和Java程序员来说,更是如此. 在这里,我们需要明白以下几个地方: 1.Pytho ...

随机推荐

  1. Java 网络I/O模型

    网络I/O模型 人多了,就会有问题.web刚出现的时候,光顾的人很少.近年来网络应用规模逐渐扩大,应用的架构也需要随之改变.C10k的问题,让工程师们需要思考服务的性能与应用的并发能力. 网络应用需要 ...

  2. signature.html

    原文网址:http://www.youdzone.com/signature.html   阮一峰:http://www.ruanyifeng.com/blog/2011/08/what_is_a_d ...

  3. J2EE&JavaEE概述

    来源 Sun公司在1998年发表JDK1.2版本的时候, 使用了新名称Java 2 Platform,即"Java2平台",修改后的JDK称为Java 2 Platform Sof ...

  4. Struts2与Spring的整合

    今天倒腾了半天,终于是把这个两个框架整合到一起了.还是要写一下总结,同时给大家一些帮助. 开发环境:myeclipse 9.0(不好用!)tomcat6.0 1.准备工作 需要导入的包:struts2 ...

  5. Android JobService的使用及源码分析

    Google在Android 5.0中引入JobScheduler来执行一些需要满足特定条件但不紧急的后台任务,APP利用JobScheduler来执行这些特殊的后台任务时来减少电量的消耗.本文首先介 ...

  6. CSS自己主动换行、强制不换行、强制断行、超出显示省略号

    P标签是默认是自己主动换行的,因此设置好宽度之后,可以较好的实现效果,可是近期的项目中发现,使用ajax载入数据之后.p标签内的内容没有换行,导致布局错乱,于是尝试着使用换行样式,尽管攻克了问题.可是 ...

  7. 微信小程序从零开始开发步骤(三)

    上一章节,我们分享了如何创建一个新的页面和设置页面的标题,这一章我们来聊聊底部导航栏是如何实现的.即点击底部的导航,会实现不同对应页面之间的切换. 我们先来看个我们要实现的底部导航栏的效果图:(三个导 ...

  8. 简体和繁体加起来有六七万个汉字,所以Unicode只能排除一些几乎不用的汉字,Unicode编码的熟悉与研究过程(内附全部汉字编码列表)

    我有一个问题是:是不是会有个别汉字无法在Unicode下表示,这种情况下就不能完全显示了? 各种编码查询表:http://bm.kdd.cc/ ---------------------------- ...

  9. Database Vault注冊

    默认情况下,在安装好Database Vault组件的Oracle HOme下创建的数据库是没有注冊Database Vault的. 1)停EM.监听.数据库 2)启用Database Vault 在 ...

  10. erlang lists

    http://blog.csdn.net/dp0304/article/details/7590233 一,带函数Pred1, all(Pred, List) -> boolean()如果Lis ...