zoukankan      html  css  js  c++  java
  • 装饰器、闭包

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

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

    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('静态方法')
  • 相关阅读:
    Linux下如何查看版本信息
    linux的top命令参数详解
    浅谈Linux内存管理机制
    python3 判断字符串是否为纯空格组成的方法
    python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
    python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)
    python3 list列表随机选取一个元素、随机选择一个user-agent
    windows系统中,在当前目录下打开cmd命令行的两种方法
    name 'reload' is not defined解决方法
    Vue.js05:vue内联样式
  • 原文地址:https://www.cnblogs.com/whcp855/p/13274263.html
Copyright © 2011-2022 走看看