裝飾器、閉包
阿新 • • 發佈:2020-07-09
閉包:就是當某個函式被當成物件返回時,夾帶了外部變數,就形成了一個閉包
閉包存在的意義就是它夾帶了外部變數(私貨)
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" ifname == "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('靜態方法')