1. eval()
class Abc:
def a(self):
return 1
print(eval("Abc")().a())结果为1
2.开闭原则
对扩展开放,对修改封闭
目的:实现可扩展性
应用:装饰器,工厂模式
如装饰器:在不改变原有代码的基础上,给其增加功能
3.__getattr__系列、__getitem__系列的魔法方法
__getitem__是在以字典的方式调用对象属性时被调用,如:obj[‘attr1’]
__getattr__是对象直接调用属性时被调用,a.name
4.partial(func,*agrs,**kwagrs)函数
如:func = partial(get_name,18),则func()就等同于get_name(18)
对于函数总是传入固定参数时,可以使用partial()
5.__name__
__name__是模块的一个内置属性
模块运行时的__name__为“__main__”
模块被导入时的 __name__为“模块名”
故被导入模块的 ”””if __name__ == '__main__':””” 不成立,代码不会被执行,只执行当前运行模块的if代码
(被导入模块的if相当于 ”””if module1.__name__ == '__main__':”””,而module1.__name__ 为”module1”)
在多进程中,子进程运行入口必须在if…main中
参考:https://stackoverflow.com/questions/34223502/why-does-this-multiprocessing-code-fail
6.threading.local()
众所周知,线程中的资源是共享的,那么,要怎么使得一个线程中的变量,其他线程无法调用呢
通过local类:
threading.local(),创建local对象
local.x,为每个线程中都创建了一个x变量,线程间不共享变量,相互独立
from threading import local
loc = local()
loc.x = 1 # 主线程中的x,与其他10个子线程相互独立,不能相互访问def func(i):
loc.x = i # 10个子线程中的x,相互独立
for i in range(10):
threading.Thread(target=func,(i,)) .start()