Python中內置裝飾器的使用


本章節主要講解python中內置裝飾器的使用,前面章節有詳細講解自定義裝飾器;

1.首先來說明什么是裝飾器?

答:python裝飾器本質上就是一個函數,它可以讓其他函數在不需要做任何代碼變動的前提下增加額外的功能,

  裝飾器的返回值也是一個函數對象

2.python內置裝飾器都有哪些?

答:特性裝飾器:@property  類方法裝飾器: @classmethod   靜態方法裝飾器:@staticmethod

3.系統裝飾器詳解:

3.1  @property 可以把一個實例方法變成其同名屬性,以支持實例訪問,它返回的是一個property屬性;

import math
class Circle:
    def __init__(self,radius): #圓的半徑radius
        self.radius=radius

    @property
    def area(self):
        return math.pi * self.radius**2 #計算面積

    @property
    def perimeter(self):
        return 2*math.pi*self.radius #計算周長

# 我們可以通過實例訪問到類中屬性
circle=Circle(10) print(circle.radius)
 
         
# 通過@property裝飾后的方法也可以像訪問數據屬性一樣去訪問area,會觸發一個函數的執行,動態計算出一個值;
print(circle.area) 
print(circle.perimeter) 

一個property對象還具有setter、deleter 可用作裝飾器;setter是設置屬性值。deleter用於刪除屬性值。而官方文檔中給出了getter用於獲取屬性信息,但是實際使用中可以直接通過property獲取屬性信息;

class C:
   def __init__(self):
        self._x = None

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

    @x.deleter
    def x(self):
        del self._x

#實例化類
c = C()
# 為屬性進行賦值
c.x=100
# 輸出屬性值
print(c.x)
# 刪除屬性
del c.x

總結:使用property:在設置屬性時,可以對值對進檢查,設置發生時,可以 修改設置的值,獲取屬性時,可以動態地計算值。

3.2  @classmethod   修飾的方法不需要實例化,不需要 self 參數,但第一個參數需要是表示自身類的 cls 參數,可以來調用類的屬性,類的方法,實例化對象等。

class A():
    number = 10

    @classmethod
    def get_a(cls):     #cls 接收的是當前類,類在使用時會將自身傳入到類方法的第一個參數
        print('這是類本身:',cls)# 如果子類調用,則傳入的是子類
        print('這是類屬性:',cls.number)

class B(A):
    number = 20
    pass

# 調用類方法 不需要實例化可以執行調用類方法
A.get_a()
B.get_a()

3.3@staticmethod:改變一個方法為靜態方法,靜態方法不需要傳遞隱性的第一參數,靜態方法的本質類型就是一個函數 一個靜態方法可以直接通過類進行調用,也可以通過實例進行調用;

import time
class Date:
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day
@staticmethod
def now(): #用Date.now()的形式去產生實例,該實例用的是當前時間 t=time.localtime() #獲取結構化的時間格式 return Date(t.tm_year,t.tm_mon,t.tm_mday) #新建實例並且返回

@staticmethod def tomorrow():#用Date.tomorrow()的形式去產生實例,該實例用的是明天的時間 t=time.localtime(time.time()+86400) return Date(t.tm_year,t.tm_mon,t.tm_mday)

a=Date('1987',11,27) #自己定義時間
print(a.year,a.month,a.day)
b=Date.now() #采用當前時間
print(b.year,b.month,b.day)
c=Date.tomorrow() #采用明天的時間
print(c.year,c.month,c.day)

 

 

 

 

 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM