sandwich()
#输出 :
#</''''''>
# #tomatoes#
# --ham--
# ~salad~
#<______/>
装饰器的顺序很重要,需要注意:
@ingredients
@bread
def strange_sandwich(food="--ham--") :
print food
strange_sandwich()
#输出 :
##tomatoes#
#</''''''>
# --ham--
#<______/>
# ~salad~
最后回答前面提到的问题:
# 装饰器makebold用于转换为粗体
def makebold(fn):
# 结果返回该函数
def wrapper():
# 插入一些执行前后的代码
return "<b>" + fn() + "</b>"
return wrapper
# 装饰器makeitalic用于转换为斜体
def makeitalic(fn):
# 结果返回该函数
def wrapper():
# 插入一些执行前后的代码
return "<i>" + fn() + "</i>"
return wrapper
@makebold
@makeitalic
def say():
return "hello"
print say()
#输出: <b><i>hello</i></b>
# 等同于
def say():
return "hello"
say = makebold(makeitalic(say))
print say()
#输出: <b><i>hello</i></b>
内置的装饰器
内置的装饰器有三个,分别是staticmethod、classmethod和property,作用分别是把类中定义的实例方法变成静态方法、类方法和类属性。由于模块里可以定义函数,所以静态方法和类方法的用处并不是太多,除非你想要完全的面向对象编程。而属性也不是不可或缺的,Java没有属性也一样活得很滋润。从我个人的Python经验来看,我没有使用过property,使用staticmethod和classmethod的频率也非常低。
class Rabbit(object):
def __init__(self, name):
self._name = name
@staticmethod
def newRabbit(name):
return Rabbit(name)
@classmethod
def newRabbit2(cls):
return Rabbit('')
@property
def name(self):
return self._name
这里定义的属性是一个只读属性,如果需要可写,则需要再定义一个setter:










