#三范式
1.一个数据一个字段
2. 只要有主键的
3. 减少重复
#GIL
叫什么:全局解释器锁cpython
有什么用:单核的情况下实现多任务NB
怎么解决:
换解释器锁jpython
进程加协程(个人建议)
线程用其他语言实现,python调用
![](https://i-blog.csdnimg.cn/blog_migrate/f0263903faa7a6eb01ed1479ae2fc390.png)
#深拷贝与浅拷贝
#深拷贝
递归拷贝每一层的数据
![](https://i-blog.csdnimg.cn/blog_migrate/10346e8cc209272528e83d45d6ddeed8.png)
#浅拷贝
拷贝第一层的数据
![](https://i-blog.csdnimg.cn/blog_migrate/406b34562213a7b125d70cfc949d0d12.png)
#跟引用的区别
引用:多个变量指向同一个内存地址
拷贝:产生一个新地址(不可变类型不会产生,int,字符串,元组)
![](https://i-blog.csdnimg.cn/blog_migrate/85b104daa9b82813ce812eea4ee94eb1.png)
#python基本上如果提供了copy方法都是浅copy
#私有化
_x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问
__xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)
__xx__:双前后下划线,用户名字空间的魔法对象或属性。例如:__init__ , __ 不要自己发明这样的名字
xx_:单后置下划线,用于避免与Python关键词的冲突
#模块搜索路径
sys.path
#模块更新
from imp import reload
#导入两种模块方式的区别
import **** 这个可以当做是引用
from **** import *** 这个可以当做深拷贝
#多态
1. python有多态,但是不是一个严谨的多态,因为Python是一个动态语言,没有强制类型;
父类能工作的地方,子类都能工作,并且不同的子类能产生不同的执行的效果
#封装
一个函数一个功能,一个类是多个相关函数的集合
#继承
子类中相同的方法会放到父类中,减少代码重复性
#mro 及多继承
mro类初始化顺序表,保持我们的类只初始化一次
super()从mro顺序表中找到自已的位置,从mro顺序表中调用下一个类
class person(object):
def __init__(self):
print("person 的init 开始调用")
class son1(person):
def __init__(self):
print("son1 的 init 开始调用")
super().__init__()
class son2(person):
def __init__(self):
print("son2 的 init 开始调用")
super().__init__()
class grandson(son1,son2):
def __init__(self):
print("grandson 的 init开始被调用")
super().__init__() # super 是调用mro顺序中下一个类
gg=grandson()
print(grandson.__mro__) # 类初始化的顺序
#实例与类之间的调用关系
实例可以调用三种类型的方法(静态,类,实例),可以调用类的属性及自我的属性
类可以调用三种类型的方法(静态,类,实例),但是不能调用实例上的属性
class A(object):
num = 100
def __init__(self):
self.age=18
print("init")
@classmethod
def get_name(cls):
print("get_name")
@staticmethod
def get_age():
print("get_age")
a = A()
a.__init__()
a.get_name()
a.get_age()
# 实例对象和类对象都可以调用 实例方法,类方法, 静态方法
A.__init__(a)
A.get_name()
A.get_age()
print(a.num) # 实例和类都可以访问 类属性
print(A.num)
print(a.age) # 实例可以访问实例属性,类不能访问实例属性
print(A.age)
#property
1. 完成常量,常量是能得到到数据,但是不能修改数据,一般常量都是大写
2. 代码实现
这个常量一般在init中创建一个私有的属性
提供一个得到这个私有属性的方法,但是我们为了让常量更直观,在方法上加入装饰器@property
调用就可以使用(类名.方法名)
class A:
def __init__(self):
self.__name ="皮皮虾"
@property
def get_name(self):
return self.__name
a = A()
print(a.get_name) # 常量这个不能让别人修改的值
#魔法属性与方法
__dict__:查看属性
__class__:查看谁创建了我
__init__:初始化
__new__:创建时,一般单例
__call__:实例()调用
# 上下文管理器
只要实现了__init__ ,__enter__,__exit__这三个方法就可以说实现了上下文管理器
1.简化了代码
2.程序退出时自动关闭
3.操作时出现异常也会自动关闭
with myopen() as f:
pass
myopen()这个调用__init__方法
as 后面的f由__enter__这个方法返回
程序执行完后退出我们会执行__exit__,一般用来关闭资源
![](https://i-blog.csdnimg.cn/blog_migrate/f721183f2b9eb2ce521f2ca25dde4061.png)