## 所谓坑,就是想象效果跟实际效果不一致的,导致容易出错、出错时还百思不得其解、被坑了很久才搞清楚的。o(╯□╰)o
1) 可变数据类型:
list和dict为可变数据类型, = 操作符是"传引用",类似C中的传指针, 要做成"传值"建议用copy.deepcopy()
# 区分"传引用:赋值操作符/return语句"、"传值:deepcopy()"
2) 全局变量:
不建议直接使用,推荐放在独立模块下、或类变量。
一定要用时,记得global声明,否则会当作局部变量处理。
3) 与包/模块名称冲突:
自己便携的脚本名、文件夹名,不要与"包/模块名"一致,否则会出现莫名奇妙的错误
4) 正则表达式:
如果要匹配上 " ", 必须设置 flags=re.S, 否则是无法匹配上回车符的。
5) 类变量的3种调用方式(对象>类>基类):
自己的总结(不一定完全正确): ① 优先级 对象>类>基类 ② 优先级高的类变量未经过__setattr__激活前,__getattr__会引用次一级优先级中的值, 激活后独立 ③不同类变量之间的激活记录独立
测试代码:
1 # encoding=utf-8 2 3 class A(object): 4 V1 = 'V1' 5 V2 = 'V2' 6 #end class 7 class B(A): 8 pass 9 #end class 10 11 if __name__ == '__main__': 12 def if_main(): 13 pass 14 ifDemoScript = False 15 ifCLIMode = False 16 17 print u"0> 类变量V1/V2在 类B/对象b都未激活__setattr__之前,统一引用基类A中的值" 18 b = B() 19 print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2) # ('V1', 'V1', 'V1', (), 'V2', 'V2', 'V2') 20 21 print u"1.1> 类变量V1在 类B/对象b都未激活__setattr__之前,基类A中改变时,B/b都(引用式)被改变" 22 A.V1 = 'V1.A' 23 print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2) # ('V1.A', 'V1.A', 'V1.A', (), 'V2', 'V2', 'V2') 24 print u"1.2> 类变量V1在 仅激活类B的__setattr__时,B中改变时,b(引用式)被改变, 但A不受影响" 25 B.V1 = 'V1.B' 26 print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2) # ('V1.A', 'V1.B', 'V1.B', (), 'V2', 'V2', 'V2') 27 print u"1.3> 类变量V1在 B/b都激活__setattr__时,b中改变时,A/B都不受影响" 28 b.V1 = 'V1.b' 29 print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2) # ('V1.A', 'V1.B', 'V1.b', (), 'V2', 'V2', 'V2') 30 print u"1.4> 类变量V1在 B/b都激活__setattr__时,重新尝试单独改变A/B/b,都相互不受影响" 31 A.V1 = 'V1.A2' 32 print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2) # ('V1.A2', 'V1.B', 'V1.b', (), 'V2', 'V2', 'V2') 33 B.V1 = 'V1.B2' 34 print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2) # ('V1.A2', 'V1.B2', 'V1.b', (), 'V2', 'V2', 'V2') 35 b.V1 = 'V1.b2' 36 print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2) # ('V1.A2', 'V1.B2', 'V1.b2', (), 'V2', 'V2', 'V2') 37 38 print u"2> 验证类变量V2与V1之间的激活独立性" 39 A.V2 = 'V2.A' 40 print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2) # ('V1.A2', 'V1.B2', 'V1.b2', (), 'V2.A', 'V2.A', 'V2.A') 41 b.V2 = 'V2.b' 42 print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2) # ('V1.A2', 'V1.B2', 'V1.b2', (), 'V2.A', 'V2.A', 'V2.b') 43 A.V2 = 'V2.A2' 44 print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2) # ('V1.A2', 'V1.B2', 'V1.b2', (), 'V2.A2', 'V2.A2', 'V2.b') 45 B.V2 = 'V2.B2' 46 print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2) # ('V1.A2', 'V1.B2', 'V1.b2', (), 'V2.A2', 'V2.B2', 'V2.b') 47 b.V2 = 'V2.b2' 48 print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2) # ('V1.A2', 'V1.B2', 'V1.b2', (), 'V2.A2', 'V2.B2', 'V2.b2')