裝飾器其實就是一個以函數作為參數並返回一個替換函數可執行函數 ...
#裝飾
import types
def shucai(n):
print('蔬菜價格7')
if type(n)==types.FunctionType:
return n()+7
return n+7
def feiniu(n):
print('精品肥牛12')
if type(n)==types.FunctionType:
return n()+12
return n+12
@feiniu
@shucai
def guodi():
print('鍋底38')
return 38
print(guodi)
#類 import 類名可以調用其它模塊
class leu():
def __init__(self):
name=None
def show(self,s):
print(self.name,s)
u=leu()
u.name='張三'
u.show('hhah')
print('內嵌函數')
def outer():
x=1
def inner():
print('in inner')
print(x)
print(locals())
inner()
b=outer()
#函數是python中的一級對象
#函數作為參數
def add(x,y):
return x+y
def sub(x,y):
return x-y
def apply(func,x,y):
return func(x,y)
print(apply(sub,1,5))#和其他變數一樣,函數名就是變數標簽
print('-------------')
def outerl():
def inner():
print('inside inner')
return inner
fl=outerl()
fl()
print('------閉包---------')
def outer(x):
def inner():
print(x)
return inner
print1=outer(1)
print2=outer(2)
print1()
print2()
print('---裝飾器---------')
def outer2(some_func):
def inner():
print('before func')
ret =some_func()
return ret +1
return inner
def foo2():
return 1
decorated=outer2(foo2)
print(decorated())
#裝飾器其實就是一個以函數作為參數並返回一個替換函數可執行函數
class Coordinate:
def __init__(self,x,y):#初始化參數
self.x=x
self.y=y
def __repr__(self):#重寫方法
return 'coord'+str(self.__dict__)
#a=Coordinate(3,4)
#print(a)
def add2(a,b):
return Coordinate(a.x+b.x,a.y+b.y)
def sub2(a,b):
return Coordinate(a.x-b.x,a.y-b.y)
one=Coordinate(100,200)
two=Coordinate(300,200)
print(add2(one,two))
print(sub(one,two))
#函數裝飾器@符號的應用
#@在定義函數的時候使用
#無參數裝飾器
def foo(func1):
print('decorator foo')
return func1
@foo
def bar():
print('bar')
bar()
#可以把函數對象作為參數