Python查缺补漏之动态实例属性

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

很多时候,很多人学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中的也会改变,最后演示了一下,列表中的元组,元组本身不可变,所以更改元组中内容会报错,且传递的是值,但是这个元组作为一个列表中的元素,我们可以整体替换掉。

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

(待续)

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。