模块导入: import xxx, from xxx import xxxx 增加路径
import sys
sys.path.append(path)
模块重新导入
from imp import reload
reload(module name)
不可以循环导入,不能在模块之间相互调用
怎样避免循环导入:导入语句放在后面需要导入时再倒入,例如放在函数体内导入
== 判断值是否相等 Is id(a), id(b)是否相等,比较两个引用是否指向了同一个对象(引用比较)
- 浅拷贝是一个对象的顶层拷贝,拷贝了引用,并没有拷贝内容 = 就是浅拷贝
- 深拷贝是对于一个对象所有层次的拷贝(递归)
import copy
c = copy.deepcopy(a)
copy.deepcopy深拷贝会把引用都拷贝出来(递归) copy.copy() 使用copy模块的copy功能的时候,它会根据当前拷贝的数据类型是可变类型还是不可变类型,有不同的处理方式:如果拷贝可变类型,只能识别第一层拷贝;如果拷贝不可变类型,是浅拷贝
略
有符号数和无符号数的概念 规则:把二进制数中的最高位(最左边的那位)用作符号位
对于有符号数,最高位被计算机系统规定为符号位(0为正,1为负) 对于无符号数,最高位被计算机系统规定为数据位
数字在计算机中,是用二进制补码的形式来保存的,因此-1+1需要按照补码进行相加才是正确的结果
1)如何计算补码? 正数:原码=反码=补码 负数:反码=符号位不变,其他位取反 补码=反码+1 溢出:越界 2) 从补码转回原码 负数补码转换原码的规则: 原码=补码的符号位不变,数据位取反,尾+1
进制的转换 bin, int, oct, hex
0b 二进制 0o八进制 0x十六进制
转换成十进制 int("",16/8/2)
把一个数的各位整体向左移动一个位,就变成原来的2倍
- & 按位于
- |按位或
- ^按位异或
- ~按位取反
- <<按位左移 >>按位右移
- 按位与: 全1才1否则0:只有对应的两个二进位均为1时,结果位才为1,否则为0
- 按位或:有1就1: 只要对应的二个二进位有一个位1时,结果位就为1,否则为0
- 按位异或:不同为1: 当对应的二进位不相同时,结果为1,否则为0
属性的名字前面加上下划线,属于私有属性,不能从外部调用的 方法:setNum(), getNum() 设置两个方法,一个设置属性,一个获取数据
- xx: 公有变量
- _xx: 单前置下划线,私有化属性或方法,from somemodule import * 禁止导入,类对象和子类可以访问
- __xx__: 双前后下划线,用于名字空间的魔法对象或属性。例如:init
- __xx: 双前置下划线,私有,无法在外部直接访问(名子重整所以访问不到)
- xx_: 单后置下划线,用于避免与python关键词的冲突
通过name mangling (名字重整),目的是防止类意外重写基类的方法或者属性:__classname__privateatribute
class Money(object):
def __init__(self):
self.__money = 0
def getMoney(self):
return self.__money
def setMoney(self, value):
if isinstance(value, int):
self.__money = value
else:
print("error:")
- 使用property,property(getNum, setNum)
t.num到底是调用getNum()还是setNum,要根据实际的场景来判断,
- 如果是给t.num赋值,那么一定调用setNum()
- 如果是获取t.num的值,那么久一定调用getNum() property的作用:相当于把方法进行了封装,开发者在对属性设置数据的时候更方便。
@property 成为属性函数,可以对属性赋值时做必要的检查,并保证代码的清晰短小,主要有2个作用 1. 将方法转换为只读 2. 重新实现一个属性的设置和读取方法,可做边界判定