python基础整理笔记(七)

一. python的类属性与实例属性的注意点

 1 class TestAtt():
 2     aaa = 10
 3
 4 def main():
 5     # case 1
 6     obj1 = TestAtt()
 7     obj2 = TestAtt()
 8     print obj1.aaa, obj2.aaa, TestAtt.aaa
 9
10     # case 2
11     obj1.aaa += 1
12     print obj1.aaa, obj2.aaa, TestAtt.aaa
13
14     # case 3
15     TestAtt.aaa += 2
16     print obj1.aaa, obj2.aaa, TestAtt.aaa
17
18 if __name__ == ‘__main__‘:
19     main()

一段示例代码,一个类TestAtt只有一个类对象,然后通过改变其不同对象的属性和类的属性,结果如下:

改变的似乎挺特殊,分析原因如下:

python中的属性获取机制,是从底层的对象到上层中一点点找的;在第一次获取obj1.aaa, obj2.aaa的时候,因为这个类并没有初始化实例的属性,所以其实obj1和obj2并没有aaa这个属性,所以实质上obj1.aaa, obj2.aaa都是TestAtt.aaa。

而对于 case2,obj1.aaa += 1这个操作实际上是给obj1这个实例创建了aaa的属性(以TestAtt.aaa的值再加1),所以从case2来看它的值就单独改变了,而且在case3中也没再受到影响。

现在我把代码修改如下再运行下结果,打印出每个实例的__dict__:

 1 def main():
 2     # case 1
 3     obj1 = TestAtt()
 4     obj2 = TestAtt()
 5     print obj1.aaa, obj2.aaa, TestAtt.aaa
 6     print obj1.__dict__
 7     print obj2.__dict__
 8
 9     # case 2
10     obj1.aaa += 1
11     print obj1.aaa, obj2.aaa, TestAtt.aaa
12     print obj1.__dict__
13     print obj2.__dict__
14
15     # case 3
16     TestAtt.aaa += 2
17     print obj1.aaa, obj2.aaa, TestAtt.aaa
18     print obj1.__dict__
19     print obj2.__dict__

这样看就很明显,可以证明上述的情况。

二. python多重继承注意点:

在python2.7里面有经典类和新式类之分,前者定义时没有明式的继承,后者会继承object类。

在多重继承后寻找属性的时候,二者的行为有一个明显的区别:

经典类是深度优先地搜索——会在条继承链上线搜索到底,再到下一个优先级的继承链上搜索,以此类推。

形式类是广度优先地搜索——在同一代际的继承者们之间按照优先级水平搜索,这一代际搜索不到,再向更上层的父辈里寻找,一次类推。

示例代码如下:

 1 class A(object):
 2     def foo(self):
 3         print "class A"
 4
 5 class A1():
 6     def foo(self):
 7         print "class A1"
 8
 9 class C(A):
10     pass
11
12 class C1(A1):
13     pass
14
15 class D(A):
16     def foo(self):
17         print "class D"
18
19 class D1(A1):
20     def foo(self):
21         print "class D1"
22
23 class E(C, D):
24     pass
25
26 class E1(C1, D1):
27     pass
28
29 e = E()
30 e.foo()
31
32 e1 = E1()
33 e1.foo()

这里字母后带数字的是经典类,不带的是新式类,然后我们运行一下结果:

证明了上面的说法。

但是我们看看在python3中的表现,一样的代码结果如下:

所以在python3中,其实并没有所谓经典类和形式类的区别了,而且多重继承的顺序统一为深度优先了。

时间: 2024-12-22 08:19:10

python基础整理笔记(七)的相关文章

python基础整理笔记(二)

一. 列表 1. 创建实例: a = [1,2,3] b = list() 2. 主要支持的操作及其时间复杂度如下: 3. 其他 python中的列表,在内存中实际存储的形式其实是分散的存储,比较类似STL中的vector,会预先分配一定长度的内存,当不够时,会申请新的更大的一块内存,将原有的数据copy过去.删除的情况也是类似的相反情况,所以如果存储的元素数量常有巨变,使用deque来代替比较好.deque是一个双向链表,不会去copy元素. 而从上图中我们也可以看出,判断 x in s的复杂

python基础整理笔记(一)

一. 编码 1. 在python2里,加载py文件会对字符进行编码,需要在文件头上的注释里注明编码类型(不加则默认是ascII). 1 # -*- coding: utf-8 -*- 2 3 print 'hello world' 2. str类型也是经过编码的有各种格式,和unicode字符串之间需要通过decode和encode互相转换.使用示例如下: 1 a = '中文' 2 3 b = a.decode('utfi-8') 4 5 c = b.encode('gb2312') 3. 在p

python基础整理笔记(三)

一. python的几种入参形式:1.普通参数: 普通参数就是最一般的参数传递形式.函数定义处会定义需要的形参,然后函数调用处,需要与形参一一对应地传入实参. 示例: 1 def f(a, b): 2 print(a,b) 3 f(1, 2) 2. 指定参数: 指定参数就是在函数调用时,给传入的实参加上其对应的形参的参数名,这样实参的顺序就可以不用和形参完全一一对应的顺序. 示例: 1 def f(a, b): 2 print(a, b) 3 f(b=1, a=2) 3. 默认参数: 默认参数是

python基础整理笔记(九)

一. socket过程中注意的点 1. 黏包问题 所谓的黏包就是指,在TCP传输中,因为发送出来的信息,在接受者都是从系统的缓冲区里拿到的,如果多条消息积压在一起没有被读取,则后面读取时可能无法分辨消息之间的分隔,造成读取的时候把前后多条消息的内容连起来读出来,就造成了错误.比较靠谱的解决方式是:一端在发送完消息以后,需要接收一次消息,另一端在第一次接收完消息以后,发送一次消息,这样间隔处理:这样就会保证每次接收的消息都是完整到结束的,因为对方在每次发送完整消息以后,都会接收消息以停止发送.在接

python基础整理笔记(八)

一. python反射的方式来调用方法属性 二. python类的一些注意点 1. 父类的方法里面用到子类的属性方法:其实是子类才会调用实例化调用父类的这个方法,所以不会出错 2. 特殊方法 __call__, 3. 特殊方法__iter__ 4. property, XXX.setter装饰器

python基础整理笔记(五)

一. 关于hashlib模块的一些注意点 hashlib模块用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512, MD5 算法: md5生成一个32位的16进制字符: SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示,比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,切长度更长. 以MD5为例,一般的计算方法如下: m = hashlib.md5() a = 'tes

jQuery整理笔记七----几个经典表单应用

1.文本框获得(失去)焦点 当文本框获得输入焦点时,将该文本框高亮显示,算不得一个应用,仅仅是一个小技巧,能够提高用户体验. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/

Python基础篇(七)

加上两个下划线变量或者方法变为私有. >>> class Bird: ...    __song = "spark" ...    def sing(self): ...       return self.__song ... >>> b = Bird() >>> b.sing() 'spark' >>> b.__sing() Traceback (most recent call last): File &qu

Python基础学习笔记(七)常用元组内置函数

参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-tuples.html 3. http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000 Python常用元组内置函数: 序号 方法及描述 1 cmp(tuple1, tuple2)比较两个元组元素. 2 len(tuple)计算元组元素个数. 3 max(tuple)