装饰器、闭包

闭包:就是当某个函数被当成对象返回时,夹带了外部变量,就形成了一个闭包

闭包存在的意义就是它夹带了外部变量(私货)

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('静态方法')
原文地址:https://www.cnblogs.com/whcp855/p/13274263.html