作者Arim (Arim5566)
看板Python
标题[问题] 函式修饰子
时间Sat Aug 18 22:44:22 2012
各位版友好
以下是一个范例
def sidedish(number):
return {
1:lambda meal:print('1'),
2:lambda meal:print('2'),
3:lambda meal:print('3'),
4:lambda meal:print('4')
}.get(number,lambda meal:print('other'))
@sidedish(2)
@sidedish(3)
def friedchicken():
return 49.0
print(friedchicken.__class__)
我想要用sidedish修饰friedchicken
请问为什麽friedchicken__class__是NonType呢@@?
这使得我无法呼叫friedchicken()
我是改
http://caterpillar.onlyfun.net/Gossip/Python/FunctionDecorator.html
里面的范例
接着第二个范例是
score = int(input('the score?'))
level = score//10
{
#
#dictionary object
10:lambda:print('Perfect'),
9:lambda:print('A'),
8:lambda:print('B'),
7:lambda:print('C'),
6:lambda:print('D'),
}.get(level,lambda:print('E'))()
请问get後面加上一个()是因为回传的是一个lambda
为了执行lambda後面的运算式才需要加嘛?
没加的话反而什麽都没print
因为我看第一个范例也是return一个字典物件的value
可是他get後面就没加()
如果第一个范例的get後面有加()的话
直译器会输出:
in sidedish
}.get(number,lambda meal:print('other'))()
TypeError: <lambda>() takes exactly 1 positional argument (0 given)
再请教一个范例:
def sidedish1(meal):
return lambda:meal()+30
def sidedish2(meal):
return lambda:meal()+40
def friedchicken():
return 49.0
friedchicken = sidefish1((sidedish2(friedchicken)))
print(friedchicken()) #119.0
想请问的是
在sidedish2(friedchicken)之後会回传friedchicken()+40(meal被代换成friedchicken)
所以回传的是一个float
但是为什麽可以当作sidedish1的参数呢
sidedish1的参数应该要是一个function吧?
谢谢各位版友的指教
--
~宅男的四个徵兆~
∠□ ○ ! * \○/ ★ (○ ?
╦╦└□ " ○□═ □ □>
║║√√ ╦══╦ ∥ |\
一回家就上PTT 每天想正妹 以当好人为乐 忘记正妹亏欠自己
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 36.239.20.44
※ 编辑: Arim 来自: 36.239.20.44 (08/18 23:14)
1F:→ gozule:范例1因为function经过decorator後,已经变成另一个func 08/19 01:39
2F:→ gozule:__class__的问题可以用functools.wrap()来解决 08/19 01:40
3F:→ gozule:最後一个范例是因为return的type为lambda, 仍然是function 08/19 01:53
4F:→ Arim:我搞懂了 感谢 08/19 12:45