Python 可呼叫例項、巢狀函式、描述符、裝飾類方法

Mondo 科技 更新 2024-01-29

函式裝飾器可以是普通函式,也可以是可呼叫類(具有呼叫(方法的類,可以像帶括號的函式一樣呼叫,自動呼叫呼叫(方法,即具有call(method)的類例項,稱為可呼叫類的例項)。

函式裝飾器可以修飾普通函式或類方法。

當類方法用普通函式修飾時,python 會將隱式 body 例項傳遞給 self;

當類方法被可呼叫的類例項修飾時,Python 只傳遞該類的乙個例項,並且可以通過顯式傳遞修飾的類例項來正確呼叫類方法。

用法:

>>class counttrace:

def __init__(self,func):

self.calls=0

self.func=func

例項名()操作,自動呼叫呼叫

致電加薪(0.2)自動呼叫counttrace的呼叫

呼叫 call ( 時,第乙個輸入引數 self 是 counttrace 類的例項。

payraise(self,rate) 的 self 為 02、不自動傳遞當前呼叫的 StaffWithDecorator 類例項。

def __call__(self,*args,**kargs):

print('self=',self)

print('*args=',args)

self.calls+=1

print('呼叫 {} 次'.format(func.__name__,calls))

return func(*args,**kargs)

return wrapper

>counttrace

def testsquare(x):

print(x**2)

>class staffwithdecorator:

def __init__(self,name,pay):

self.name=name

self.pay=pay

巢狀函式修飾類方法,這些方法在呼叫時自動將類例項傳遞給 *args to self

counttrace

def payraise(self,rate):

print('self=',self)

self.pay*=(1.0+rate)

>testsquare(3)

func=

args= (3,)

呼叫 testsquare 1 次。

>s1=staffwithdecorator('張三',51000)

>s1.payraise(0.2)

func=

args= (,0.2)

致電加薪 1 次。

self= <_main__.staffwithdecorator object at>

>s1.pay

描述:正如前面描述符部分中的習,描述符是乙個具有 get (set (delete ( 方法的類,並將這樣的例項分配給另乙個類的屬性以供使用。

get (截獲屬性的點運算,call (截獲例項的括號運算。

當描述符同時定義 call 和 get 時,get 方法需要返回乙個可呼叫的物件,例如例項本身,否則無法對例項的括號進行算術運算。

get 方法有三個引數:self、instance 和 owner。

>>class getclass:

get(攔截點。 操作。

您需要自行返回例項本身

執行括號算術。

def __get__(self,instance,owner):

print('獲取屬性')

return self

call (截獲括號() 操作。

def __call__(self):

print('可呼叫的類例項')

>class testget:

gc=getclass()

>tg=testget()

時期。 操作。

>tg.gc

獲取屬性<_main__.getclass object at>

時期。 算術和括號 () 算術。

>tg.gc()

獲取屬性可呼叫的類例項

描述:描述符是具有 get、set 和 delete 方法的類,將描述符類的例項分配給另乙個類的屬性將自動攔截該屬性的點、賦值和刪除操作。

裝飾器作為描述符編寫,修飾後的 body 類方法反彈到描述符類例項,在執行點和括號操作時自動呼叫描述符的 get 和 call 方法。

描述符可以修飾普通函式和類方法。

1)裝飾器定義呼叫方法

2)裝飾器定義get(方法,該方法接收描述符類例項和主體類例項,返回可呼叫例項,該可呼叫例項的建構函式接收描述符類例項和主體類例項;

3)當返回的可呼叫例項進行括號操作時,執行描述符類例項的括號操作,呼叫描述符類的呼叫方法,並將主體類例項的輸入引數和主體類例項的原始類方法傳遞給*args。

>>class counttrace:

def __init__(self,func):

self.calls=0

self.func=func

例項名()操作,自動呼叫呼叫

def __call__(self,*args,**kargs):

print('self1=',self)

print('*args=',args)

self.calls+=1

print('呼叫 {} 次'.format(self.func.__name__,self.calls))

return self.func(*args,**kargs)

def __get__(self,instance,owner):

print('self2=',self)

print('instance=',instance)

print('owner=',owner)

返回可呼叫物件,否則括號無法算術。

return wrapper(self,instance)

>class wrapper:

def __init__(self,desc,subj):

self.desc=desc

self.subj=subj

定義括號。

def __call__(self,*args,**kargs):

例項括號操作,desc() 呼叫 counttrace 的呼叫

return self.desc(self.subj,*args,**kargs)

>counttrace

def testsquare(x):

print(x**2)

>class staffwithdecorator:

def __init__(self,name,pay):

self.name=name

self.pay=pay

counttrace

def payraise(self,rate):

print('self3=',self)

self.pay*=(1.0+rate)

>testsquare(3)

self1= <_main__.counttrace object at>

args= (3,)

呼叫 testsquare 1 次。

>s1=staffwithdecorator('張三',51000)

>s1.payraise(0.2)

self2= <_main__.counttrace object at>

instance= <_main__.staffwithdecorator object at>

owner=

self1= <_main__.counttrace object at>

args= (,0.2)

致電加薪 1 次。

self3= <_main__.staffwithdecorator object at>

相關問題答案

    Python中choices函式的用法 選項與隨機性的完美結合

    在 Python 中,choices 函式是乙個非常有用的工具,它允許我們從給定的選項列表中隨機選擇乙個元素。本文將深入介紹選擇函式的使用,包括其基本概念 使用場景 引數分析以及實際應用。秋冬入住挑戰 通過本文的習,讀者將能夠熟練使用選擇函式,並在程式設計中充分利用它。基本概念。choices 函式...

    Python 程式設計示例 如何使用 return

    在Python程式語言中,return語句有乙個非常重要的目的。它用於從函式返回值,以便在呼叫函式時獲取結果。return 語句可用於多種資料型別,例如整數 浮點數 字串 列表等。以下是如何使用 return 語句的一些示例 .返回乙個整數 def add a,b result a b return...

    詳細迴圈的 Python 程式設計示例

    Python 中的 for 迴圈是一種常見的控制流語句,它允許您遍歷序列 例如列表 元組 字典等 或其他可迭代物件來執行特定操作。在 Python 中,迴圈有很多用途,下面我將介紹其中的一些和示例。.遍歷列表。您可以使用 for 迴圈遍歷列表並對每個元素執行特定操作。例如,以下 將列印列表中的每個元...

    揭開 Python 中隨機函式的技巧,幫助您成為程式設計大師!

    在 Python 中使用 shuffle 函式在 Python 中,shuffle 函式是一種用於隨機加擾序列的方法。它可以用於字串 列表等可迭代物件,而不是返回乙個新物件,而是直接對原始物件進行無序操作。shuffle 函式是 random 模組中的乙個方法,因此在使用之前需要匯入 random ...

    揭開 Python 技巧的神秘面紗 在 python 中使用 isprime 使您成為程式設計大師!

    在 Python 中 isprime 的用法在 Python 中,isprime 函式是乙個工具函式,用於確定乙個數字是否為素數。質數是乙個正整數,只能被 整除,不包括 。isprime 函式接受乙個整數作為引數,並返回乙個布林值,指示該數字是否為素數。要使用 isprime 函式,首先需要匯入相應...