r):
def __init__(self, sth):
"""初始化父类"""
super().__init__(sth) 类似C++中在初始化行构造父类
- 覆盖父类的函数/方法:只要子类的函数名和父类有的函数重复了就会override
- python的继承顺序,简要提一下:python2是深度优先,python3是广度优先,具体可以参考:Python类的继承
其他:
暂时没有学到什么东西了,碰到了再深入下去。
Python特殊的引用变量
- 其实python中每个变量名所拥有的内容其实是一个引用(指针)指向的是一个静态池中的常量
- 所以当变量给变量赋值的时候,给的值并不是他所对应的常量,而是将自己的指针的地址给了另一个变量,导致了这两个变量同时共享这一个常量
- 如果改变一个变量中的值,即改变了这个常量的值,那么另一个变量的值也随之改变。
- 因此在列表赋值的时候,不要直接用=,而是用a = s[:]的方式,因为s[:]是s的一份拷贝,新的列表,这就是上面所提到的一种copy,这种方法等效于a = s.copy()
e.g.
>>> a = [1, 2, [3, 4]]
>>> b = a.copy()
>>> b[0] = 3
>>> b
[3, 2, [3, 4]]
>>> a
[1, 2, [3, 4]]
#a没有受到影响,拷贝成功
- 但是,注意b这里是二维的,如果改变了第二位的列表中的值,a会受到影响吗。
e.g.
>>> b[2][0] = 123
>>> b
[3, 2, [123, 4]]
>>> a
[1, 2, [123, 4]]
#a受到影响了!
- 可以想象到,在copy的过程中是将a列表中每个元素的值重新拷贝了一份新的引用给b,但是,中间嵌套的列表[2, 3, 4](看做一个元素)的值其实是一个引用(这里要好好想一下哦),把一个一样的值(也就是地址一样的指针)给了b,那么其实b这个位置的元素和a这个位置的元素共享的是一个地址,会受影响。
- 为了解决这个问题,
import copy
,使用copy.deepcopy()
e.g.
>>> b = copy.deepcopy(a)
#此时b和a不会相互影响,自己做一下实验吧
- 根据我自己的理解解释一下(下次去查一下官方说明),deepcopy所做的事情其实是递归copy,层层深入copy
- 还有一件比较重要的事情:根据上述所说,operator =赋值的都是引用,因此函数在形实结合之后,函数体内改变形参同样会改变实参,如果不想这样,怎么做上面写了几个方法。有点像c++中默认传递T&(引用)类型。
python中的多文件
- 据我现在的理解,就是将函数,类写在别的.py文件,用的时候import即可。