闭包:就是当某个函数被当成对象返回时,夹带了外部变量,就形成了一个闭包
闭包存在的意义就是它夹带了外部变量(私货)
def make_printer(msg): def printer(): print msg # 夹带私货(外部变量msg) return printer # 返回的是函数,带私货的函数,msg从外传进来了 printer = make_printer('Foo!') printer()
装饰器是修改函数功能的函数,可以让你的代码更简洁:
1、在函数中可以定义函数
def hi(name="yasoob"): print("now you are inside the hi() function") def greet(): return "now you are in the greet() function"
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
3、函数可以作为参数传递:
def hi(): return "hi yasoob!" def doSomethingBeforeHi(func): print("I am doing some boring work before executing hi()") print(func())
4、写一个装饰器:
def debug(func): def wrapper(): print "hello,你好"return func() return wrapper @debug def say_hello(): print "hello!"
#######带参数的装饰器 def debug(func): def wrapper(*args, **kwargs): # 指定宇宙无敌参数print 'Prepare and say...', return func(*args, **kwargs) return wrapper # 返回 @debug def say(something): print "hello {}!".format(something)
5、内置装饰器:@property
### @propertyproperty
装饰器把一个方法变成属性调用
我们在对实例属性操作的时候,就知道该属性很可能不是直接暴露的,而是通过getter和setter方法来实现的
class Student(object): @property def score(self): return self._score @score.setter #把setter方法变成属性调用 def score(self, value): if not isinstance(value, int): raise ValueError('score must be an integer !') if value < 0 or value > 100: raise ValueError('score must between 0 - 100 !') self._score = value if __name__ == '__main__': s = Student() s.score = 50 # 实际转化为s.set_score() print(s.score) # 实际转化为s.get_score() s.score = 101
6、 @classmethod类方法 、 @staticmethod静态方法
@classmethod #装饰器、可以视为一个函数 def help(cls): #类方法、cls就是类straff,一些公共的方法,就用类方法,类方法里面不能调用实例方法,不能调用实例变量 print(cls.nation) cls.show() # 静态方法,可以看成一个单纯的函数,和类本身没有关系,不能使用类或实例的任何属性和方法;类对象或实例对象都可以调用它 @staticmethod def show(): #静态方法可以不带参数 print('静态方法')