云集网站哪个公司做的,个人可以建网站卖东西吗,网站开发 需要用到什么软件,青岛市城阳区建设局网站文章目录 [toc]闭包什么是装饰器装饰器示例不使用装饰器语法使用装饰器语法 装饰器传参带参数的装饰器类装饰器魔术方法\__call__()类装饰器示例带参数类装饰器property装饰器分页操作商品价格操作 个人主页#xff1a;丷从心
系列专栏#xff1a;Python基础
学习指南… 文章目录 [toc]闭包什么是装饰器装饰器示例不使用装饰器语法使用装饰器语法 装饰器传参带参数的装饰器类装饰器魔术方法\__call__()类装饰器示例带参数类装饰器property装饰器分页操作商品价格操作 个人主页丷从心·
系列专栏Python基础
学习指南Python学习指南 闭包
在学习装饰器之前先来了解什么是闭包【Python基础】闭包2157字 什么是装饰器
装饰器可以在不改变函数或类已有代码的前提下为其增加额外功能装饰器本质上是一个高阶函数它接受一个函数或类作为输入并返回一个新的函数或类作为输出这个新的函数或类具有扩展或修改原始函数或类行为的功能 装饰器示例
不使用装饰器语法
def debug(func_obj):def wrapper():print(f[DEBUG]: {func_obj.__name__})func_obj()return wrapperdef say_hello():print(hello)say_hello debug(say_hello)
say_hello()[DEBUG]: say_hello
hellodebug(say_hello)的返回值是一个函数使用变量say_hello进行接收于是函数say_hello()被增加了功能
使用装饰器语法
装饰器通过使用符号紧跟在函数或类定义之前来使用
def debug(func_obj):def wrapper():print(f[DEBUG]: {func_obj.__name__})func_obj()return wrapperdebug
def say_hello():print(hello)say_hello()[DEBUG]: say_hello
hello本质上debug的作用就是执行了say_hello debug(say_hello)为函数say_hello 增加了功能 装饰器传参
如果被装饰的函数带有参数调用时需要进行传参
def debug(func_obj):def wrapper(*args, **kwargs):print(f[DEBUG]: {func_obj.__name__})func_obj(*args, **kwargs)return wrapperdebug
def say(message):print(message)say(Hello, world!)[DEBUG]: say
Hello, world!带参数的装饰器
def level(lev):def logger(func):def wrapper(*args, **kwargs):print(f[{lev}]: {func.__name__})func(*args, **kwargs)return wrapperreturn loggerlevel(INFO)
def say(message):print(message)[INFO]: say
Hello, world!本质上level(INFO)的作用就是执行了say level(INFO)(say)为函数say增加了功能
def level(lev):def logger(func):def wrapper(*args, **kwargs):print(f[{lev}]: {func.__name__})func(*args, **kwargs)return wrapperreturn loggerdef say(message):print(message)say level(INFO)(say)
say(Hello, world!)[INFO]: say
Hello, world!类装饰器
魔术方法_call_()
一个类实现了魔术方法__call__()时当对象被调用时会自动触发__call__()方法
class Test:def __call__(self, *args, **kwargs):print(我被触发了...)test Test()
test()我被触发了...类装饰器示例
class Debug:def __init__(self, func_obj):self.func_obj func_objdef __call__(self, *args, **kwargs):print(f[DEBUG]: {self.func_obj.__name__})self.func_obj(*args, **kwargs)Debug
def say(message):print(message)say(Hello, world!)[DEBUG]: say
Hello, world!本质上Debug的作用就是执行了say Debug(say)为函数say增加了功能
带参数类装饰器
class Logger:def __init__(self, levelinfo):self.level leveldef __call__(self, func):def wrapper(*args, **kwargs):print(f[{self.level}]: {func.__name__})func(*args, **kwargs)return wrapperLogger(levelERROR)
def say(message):print(message)say(Hello, world!)本质上Logger(levelERROR)的作用就是执行了say Logger(levelERROR)(say)为函数say增加了功能
property装饰器
被property装饰的方法可以看作一个实例属性在调用时无需()
分页操作
class Page:def __init__(self, page_number):self.page_number page_numberself.page_size 10propertydef start(self):val (self.page_number - 1) * self.page_sizereturn val 1propertydef end(self):val self.page_number * self.page_sizereturn valpage Page(2)print(f第 {page.page_number} 页, 显示第 {page.start} - {page.end} 条内容)商品价格操作
class Goods:def __init__(self, ori_price):self.ori_price ori_pricepropertydef price(self):print(价格正在获取中...)return self.ori_priceprice.setterdef price(self, new_price):print(价格正在修改中...)self.ori_price new_priceprice.deleterdef price(self):print(价格正在删除中...)goods Goods(100)goods_price goods.price
print(goods_price)goods.price 200
print(goods.ori_price)del goods.price对被property装饰的属性进行修改时会触发被price.setter装饰的方法删除被property装饰的属性时会触发被price.deleter装饰的方法