del hi
print(hi())
#outputs: NameError
print(greet())
#outputs: 'hi yasoob'
2.2 返回值类型为函数
函数的返回值可以为函数对象:
def hi(name="yasoob"):
def greet():
return "now you are in the greet() function"
def welcome():
return "now you are in the welcome() function"
if name == "yasoob":
return greet
else:
return welcome
a = hi()
print(a)
#outputs: <function greet at 0x7f2143c01500>
print(a())
#outputs: now you are in the greet() function
a 为 hi 函数执行的返回值,此时 a 为一个函数对象,执行 a 得到返回值执行的结果
2.3 参数类型为函数
既然函数对象可以作为返回值,那么不难理解也可以作为参数:
def hi():
return "hi yasoob!"
def doSomethingBeforeHi(func):
print("I am doing some boring work before executing hi()")
print(func())
doSomethingBeforeHi(hi)
#outputs:I am doing some boring work before executing hi()
# hi yasoob!
def logged(func):
def with_logging(*args, **kwargs):
print(func.__name__ + " was called")
return func(*args, **kwargs)
return with_logging
@logged
def foo7(x):
"""do some math"""
return x + x * x
foo7(8)
# prints 'foo7 was called\n72'
上述代码等价于如下:
foo7 = logged(foo7)
print foo7.__name__ # prints 'with_logging'
print foo7.__doc__ # prints None
from functools import wraps
def logged(func):
@wraps(func)
def with_logging(*args, **kargs):
print(func.__name__ + " was called")
return func(*args, **kargs)
return with_logging
@logged
def foo8(x):
"""do some math"""
return x + x * x
print foo8.__name__ # prints 'f'
print foo8.__doc__ # prints 'do some math'
3.5 内置装饰器
主要包括:@property、@staticmathod、@classmethod
3.5.1 @property
对于 Class 的某个方法,可以通过 @property 装饰器将其伪装成一个属性,以 实例.方法 方式调用:
from math import pi
class Circle:
def __init__(self,r):
self.r = r
@property
def perimeter(self):
return 2*pi*self.r
@property
def area(self):
return self.r**2*pi
c1 = Circle(5)
print(c1.area)
# prints '78.5398163397'
print(c1.perimeter)
# prints '31.4159265359'