關於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])