1. 程式人生 > >python 類內部裝飾器的實現 與 引數解構學習

python 類內部裝飾器的實現 與 引數解構學習

學習了函式的裝飾器的寫法,然後想到如果要在類中初始化或獲取資訊時能用裝飾器做過濾和驗證應該怎麼寫呢,

在網上查了下相關資訊,感覺這樣也是可以的,不知道會不會有什麼問題class Ctj():

class Ctj():
    sex = 'man'
    name = 'name'
    age = '16'

    def wrapper_func(func):
        # self 通過結構 可將需要單獨使用的引數取出來
        # *args 獲取位置引數的可變引數
        # **kwargs 關鍵字引數的可變引數
        def wrapper(self, *args, **kwargs):
            
return func(self, *args, **kwargs) return wrapper def __init__(self, name=''): self.name = name @wrapper_func def get_name(self, a='1', b='2'): return self.name @wrapper_func def set_userinfo(self, name, age, sex): self.name = name self.age
= age self.sex = sex @wrapper_func def get_userinfo(self): print('hello') return 'name: %s, age: %s, sex: %s' % (self.name, self.age, self.sex) if __name__ == "__main__": ctj = Ctj() ctj.set_userinfo('Carlos', '25', 'man') print(ctj.get_userinfo())

  其中要了解引數型別:

一、先普及下函式的定義

def 函式名(引數列表):
    函式體(程式碼塊)
    [return 返回值] p

  Python的函式沒有return語句,隱式會返回一個None

二、引數型別

  函式傳入的引數是實參,定義函式時寫的引數是形參,用於獲取引數

  在python中經常會用到*args, **kwargs

1.位置引數的可變引數
在形參前使用*表示該形參是可變引數,可以接收多個實參
收集多個實參為一個tuple
*args,可以接受0到任意個引數
2.關鍵字引數的可變引數
形參前使用**符號,表示可以接收多個關鍵字引數
收集的實參名稱和值組成一個字典
**kwargs,可以接受0到任意個引數
3.可變引數混合使用[*args中的引數可以通過引數名匹配單獨提前取出,這裡*args中將失去這個引數]
def showconfig(username, password, **kwargs, *args):  #**kwargs 不能放在*args之前
def showconfig(username, password, **kwargs) #username,password可以同時當作位置引數或者keywords引數
def showconfig(username, *args, **kwargs)     #username不能做關鍵字引數,關鍵字引數不能放在可變位置引數之前

  引數的其他用法及特點

  1、keyword-only引數

如果在一個星號引數後,或者一個位置可變引數後,出現的普通引數,實際上已經不是普通的 引數了,而是keyword-only引數
def fn(*args, x, y, **kwargs): #x,y放在位置可變引數之後,在傳遞實參的時候,必須要用關鍵字引數傳遞x,y否則會報錯
args可以看做已經截獲了所有的位置引數,x,y不使用關鍵字引數就不可能拿到實參 <br>def fn(y, *args, x=5):  #x 是 keyword-only引數

  2、keyword-only另外一種形式

def fn(*,x,y):
*號之後,普通形參都變成了必須給出的keyword-only 引數

  3、引數規則

引數列表引數一般順序是,普通引數、預設引數、可變位置引數、keyword-only引數(可帶缺 省值)、可變關鍵字引數
def fn(x, y, z=3, *args, m=4, n, **kwargs):
1.x,y傳遞的實參不可省略
2.fn(100,99,98,97,m='a',n='b')    #位置引數超2個就會更該預設引數
3.fn(100,99,m='a',n='b')    #傳遞2個位置引數的時候預設引數生效

  4、引數解構

給函式提供實參的時候,可以在集合型別前使用*或者**,把集合型別的結構解開,提取出所有 元素作為函式的實參
非字典型別使用*解構成位置引數
字典型別使用**解構成關鍵字引數
提取出來的元素數目要和引數的要求匹配,也要和引數的型別匹配
def add(x, y):
add(4, 5)     #正常呼叫
add((4,5))     #錯誤呼叫被當做一個引數
add(*(4,5))    #引數解構
add(*range(1,3))
add(**{'a': 5, 'b': 6})      #解構value
add(*{'a': 5, 'b': 6})         #解構key

  5、引數解構例子

import random
def double_valuse(*nums):
    return max(nums),min(nums)
#呼叫1
x,y = double_valuse(*[random.randint(1,20) for i in range(10)])
print(x,y)

#呼叫2,print() 也是個函式,所以在列印的時候 double_vaules也可以引數解構
print(*double_valuse(*[random.randint(1,20) for i in range(10)]))

文章參考:https://www.cnblogs.com/harden13/p/8782782.html