* 浅拷贝是对一个对象的顶层拷贝
* 通俗的理解就是:拷贝了引用,并没有拷贝内容
深拷贝是对于一个对象所有层次的拷贝(递归)
浅拷贝对不可变类型和可变类型的copy不同
* is 是比较两个引用是否指向了同一个对象(引用比较)。
* == 是比较两个对象是否相等。
property成为属性函数,可以对属性赋值时做必要的检查,并保证代码的清晰短小,主要有2个作用
* 将方法转换为只读
* 重新实现一个属性的设置和读取方法,可做边界判定
* 父类中属性名为__名字的,子类不继承,子类不能访问
* 如果在子类中向__名字赋值,那么会在子类中定义的一!
个与父类相同名字的属性
* _名的变量、函数、类在使用from xxx import *时都不会被导入
init.py控制着包的导入行为 init.py为空:仅仅是把这个包导入,不会导入包中的模块 all:在init.py文件中,定义一个all变量,它控制着 from 包名 import *时导入的模块当你导入一个模块,Python解析器对模块位置的搜索顺序是:
当前目录
* 如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。
* 如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/
* 模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
* 如果try嵌套,那么如果里面的try没有捕获到这个异常,那么外面的try会接收到这个异常,然后进行处理,如果外边的try依然没有捕获到,那么再进行传递。。。
* 如果一个异常是在一个函数中产生的,例如函数A—->函数B—->函数C,而异常是在函数C中产生的,那么如果函数C中没有对这个异常进行处理,那么这个异常会传递到函数B中,如果函数B有异常处理那么就会按照函数B的处理方式进行执行;如果函数B也没有异常处理,那么这个异常会继续传递,以此类推。。。如果所有的函数都没有处理,那么此时就会进行异常的默认处理,即通常见到的那样
* 注意观察上中,当调用test3函数时,在test1函数内部产生了异常,此异常被传递到test3函数中完成了异常处理,而当异常处理完后,并没有返回到函数test1中进行执行,而是在函数test3中继续执行
1. 定义一个类属性 init_flag 标记是否 执行过初始化动作,初始值为 False
2.
在 init 方法中,判断 init_flag,如果为 False 就执行初始化动作
3.
然后将 init_flag 设置为 True
4.
这样,再次 自动 调用 init 方法时,初始化动作就不会被再次执行 了
* __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供
*
new必须要有返回值,返回实例化出来的实例,这点在自己实现new时要特别注意,可以return父类new出来的实例,或者直接是object的new出来的实例
*
init有一个参数self,就是这个new返回的实例,init在new的基础上可以完成一些其它初始化的动作,init不需要返回值
*
我们可以将类比作制造商,new方法就是前期的原材料购买环节,init方法就是在有原材料的基础上,加工,初始化商品环节
1. 实例方法 —— 方法内部需要访问 实例属性
* 实例方法 内部可以使用 类名. 访问类属性
2. 类方法 —— 方法内部 只 需要访问 类属性
3. 静态方法 —— 方法内部,不需要访问 实例属性 和 类属性
提问如果方法内部 即需要访问 实例属性,又需要访问 类属性,应该定义成什么方法?答案
* 应该定义 实例方法
* 因为,类只有一个,在 实例方法 内部可以使用 类名. 访问类属性
从类方法和实例方法以及静态方法的定义形式就可以看出来,类方法的第一个参数是类对象cls,那么通过cls引用的必定是类对象的属性和方法;而实例方法的第一个参数是实例对象self,那么通过self引用的可能是类属性、也有可能是实例属性(这个需要具体分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性优先级更高。静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过类对象来引用
网友评论