关于python一切皆对象的理解
关于python一切皆对象的理解
1. 关于python传递参数的方式(值传递和引用传递):
python是一些皆对象的,关于传参,就是python的对象传进去,就是对象引用传递,但是python有可变类型和不可变类型,这是在其他语言没有的概念,当传递对象是不可变类型,就像其他语言的值传递,当对象是可变类型,就相当于其他语言的引用传递
2. python装饰器
1.装饰器的本质就是闭包,只要编程语言中函数可以当值来传递,都可以实现闭包(函数是一等公民),然而python一切皆对象,自然可以实现闭包,装饰器有有和无参装饰器
2.无参:
def dec(func):
def inner(*args,**kwargs):
res = func(*args,**kwargs)
return res
return inner
3.运用场景,登录装饰器,我要你根据用户身份的不同,最后打印不同的字
def out(X):X你穿的参数
def dec(func):
def inner(*args,**kwargs):
if X = '学生'
res = func(*args,**kwargs)
print(‘去写作业’)
return res
if X = ‘老师’:
res = func(*args,**kwargs)
print(‘去上课’)
return res
return inner
return dec
使用:
@out(X)
def login():
pass
3.猴子补丁
核心思想 -------- 模块运行时替换的功能!!!
猴子补丁运用的是python的一切皆对象
体会1:class Dog():
def eat(self):
print('我在吃骨头')
class Cat():
def eat(self):
print('我在吃鱼')
cat = Cat()
cat.eat = Dog.eat
以后调用cat.eat()的时候,猫被换成了吃骨头
体会2:很多代码用到 import json,后来发现ujson性能更高,如果觉得把每个文件的import json 改成 import ujson as json成本较高,或者说想测试一下用ujson替换json是否符合预期,只需要在入口加上:
import json
import ujson
def monkey_patch_json():
json.__name__ = 'ujson'
json.dumps = ujson.dumps
json.loads = ujson.loads
monkey_patch_json()
体会3:
from gevent import monkey
monkey.patch_all() ;打补丁
import gevent
import time
def play():
print('1号玩')
time.sleep(2)
print('2号在玩')
def eat():
print('1号在吃')
time.sleep(2)
print('2在吃')
a = gevent.spawn(eat)
b = gevent.spawn(play)
gevent.joinall([a,b])
永远不要高估自己