python——裝飾器和@property裝飾器

裝飾器

1、裝飾器函數的本質:一個閉包函數

2、裝飾器函數的作用: 在不修改原函數及其調用方式的情況下對原函數功能進行擴展

3、語法糖 格式:@裝飾器名稱

4、創建帶返回值的裝飾器

5、創建傳遞參數的裝飾器

6、裝飾器的固定格式

def wrapper(f):
    def inner(*args,**kwargs):
        ret=f(*args,**kwargs)
        return ret
    return  inner
@wrapper
def fun(*args,**kwargs):
    print("zzz")

7、解決被裝飾函數不能查看信息bug 導入wraps from functools import wraps @wraps(func)

8、添加多個裝飾器
格式:
@wrapper1
@wrapper2
def f(): 執行原理:先執行距離函數近的裝飾器@wrapper2

練習:

import time
def timer(func):
    def inner():
        start=time.time()
        time.sleep(0.1)
        ret=func()
        end=time.time()
        print("程序運行的時間{}".format(start-end))
        return ret
    return inner

@timer
def fun():
    print("華晨宇演唱會")
    return "你去了沒"

ret=fun()
print(ret)

結果:

華晨宇演唱會
程序運行的時間-0.1094198226928711
你去了沒

@property裝飾器

1、@property 內置裝飾器函數,把一個方法調用方式變成屬性調用方式。(將一 個方法當成一個屬性使用)。注意@property裝飾器只能在面向對象中使用。

2、訪問使用@property裝飾器裝飾的函數可以直接調用函數名 (會執行一段功能(函數)然後返回值)

3、@property 裝飾器只能修飾不帶參數的方法。

4、@property裝飾器修飾私有方法的getter和setter方法。和控制屬性的訪問權 限­只讀。
練習:

class Person:
    def __init__(self,name,age):
        self.__name=name
        self.__age=age
    @property
    def name(self):
        return self.__name
    @property
    def age(self):
        return self.__age
    @age.setter
    def age(self,age):
        return self.__age
    @age.setter
    def age(self,age):
        if age<=0 or age>150:
            print("火星來的吧")
            return
        else:
            self.__age=age
person=Person("zs",17)
person.age=31
print(person.age)

結果:

31

練習2:

BMI指數計算 成人的BMI數值: 過輕:低於18.5
正常:18.5­23.9 過重:24­27 肥胖:28­32 非常肥胖, 高於32 體質指數(BMI)=體重(kg)÷身高^2(m) EX:70kg÷(1.75×1.75)=22.86


class  Person:
    def __init__(self,name,weight,height):
        self.name=name
        self.weight=weight
        self.height=height
    @property
    def bmi(self):
        return self.weight/(self.height**2)
    @bmi.setter
    def bmi(self,bmi):
        if bmi>18.5 and bmi<23.9:
            print("正常")
        else:

            bmi="18.5---23.9"
            print("不正常,bmi應該在{}".format(bmi))

people=Person("as",80,1.65)
people.bmi=40
print(people.bmi)

結果:

不正常,bmi應該在18.5---23.9
29.384756657483933
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章