1. 程式人生 > 實用技巧 >裝飾器、閉包

裝飾器、閉包

閉包:就是當某個函式被當成物件返回時,夾帶了外部變數,就形成了一個閉包

閉包存在的意義就是它夾帶了外部變數(私貨)

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('靜態方法')