当前位置: 首页 > news >正文

做网站实现图片自动压缩/如何搭建自己的网站

做网站实现图片自动压缩,如何搭建自己的网站,网站建设的目标有哪些,全国备案网站数量Python中函数有一个装饰器的概念,今天,看核心编程中的函数一章的时候接触到了这个概念,炸一看来,讲的说明真实不好明白。于是写下本篇以示说明,提供给迷糊者。希望能对一些人起到一定的帮助 装饰器的语法以开头&#x…

Python中函数有一个装饰器的概念,今天,看核心编程中的函数一章的时候接触到了这个概念,炸一看来,讲的说明真实不好明白。于是写下本篇以示说明,提供给迷糊者。希望能对一些人起到一定的帮助

装饰器的语法以@开头,接着是装饰器要装饰的函数的申明等。

其实总体说起来,装饰器其实也就是一个函数,一个用来包装函数的函数,装饰器在函数申明完成的时候被调用,调用之后申明的函数被换成一个被装饰器装饰过后的函数。装饰器分为无参装饰和有参装饰

无参装饰很简单

定义方法如下:

比如先定义一个装饰方法:

1

2

3

4

5

6

defFirstDeco(func):

print'第一个装饰器'

returnfunc

@FirstDeco

deftest():

print'asdf'

申明完成之后显示(在shell里试一下就知道了)

>>>第一个装饰器

可见装饰器在函数定义完成的时候被触发

然后,咱们运行

>>>test

>>>asdf

多参装饰:

多参装饰复杂一点,多参装饰的时候,装饰函数先处理参数,再生成一个新的装饰器函数,然后对函数进行装饰

具体代码如下:

1

2

3

4

5

6

7

8

9

10

defdeco(x):

print'%s 开始新装饰'

defnewDeco(func):

deftest(a,b):

print'begin'

returnv=func(a,b)

print'end'

returnreturnv

returntest

returnnewDeco

这里定义了一个装饰其函数deco,里面有一个参数x,这个时候,我们没有直接使用func作为装饰函数的参数,而是只用了参数x作为参数,之后定义一个新的装饰函数,newdeco,该函数才装饰

然后定义如下:

1

2

3

4

5

6

@deco(3)

defmytest(x,y):

ifx>y:

printx

else:

printy

运行之后的结果为

>>>%s 开始新装饰 >>> mytest(3,4) begin 4 end

装饰方法的产生:

Python2.2通过增加静态方法和类方法扩展了Python的对象模型。但是当时没有提供一个简化的语法去定义static/class方法,只得在定义好的方法尾部去调用staticmethod()/classmethod()方法达到目的。例如:

1

2

3

4

classC:

defmeth (cls):

meth=classmethod(meth)# 使meth方法成为类方法

但是这样会造成一个问题:当一个方法比较长时,很容易忘记尾部的调用。为了简化这个操作一个新的语法被加了进来:方法装饰,以@开头后跟装饰方法 名,如@staticmethod/@classmethod,由此产生出decorator方法及decorator模式。现在我们可以这样写:

1

2

3

classC:

@classmethod

defmeth (cls):

可以对一个方法应用多个装饰方法:

1

2

3

4

5

6

7

8

@A

@B

@C

deff ():

#等价于下面的形式,Python会按照应用次序依次调用装饰方法(最近的先调用)

deff():

f=A(B(C(f)))

装饰方法解析:

每个decorator只是一个方法, 可以是自定义的或者内置的(如内置的@staticmethod/@classmethod)。decorator方法把要装饰的方法作为输入参数,在函数体内可以进行任意的操作(可以想象其中蕴含的威力强大,会有很多应用场景), 只要确保最后返回一个可执行的函数即可(可以是原来的输入参数函数, 或者是一个新函数)。decorator的作用对象可以是模块级的方法或者类方法。decorator根据应用时的参数个数不同分为两类:无参数 decorator,有参数decorator。下面分别介绍。

无参数decorator:

1

2

3

4

5

6

7

8

9

10

11

12

13

defdeco(func):

"""无参数调用decorator声明时必须有一个参数,这个参数将接收要装饰的方法"""

print"Enter decorator" #进行额外操作

func.attr='decorated' #对函数进行操作,增加一个函数属性

returnfunc#返回一个可调用对象(此例还是返回作为输入参数的方法)

#返回一个新函数时,新函数可以是一个全局方法或者decorator函数的内嵌函数,

#只要函数的签名和被装饰的函数相同

@deco

defMyFunc():#应用@deco修饰的方法

print"Enter MyFunc"

MyFunc()#调用被装饰的函数

注意:当使用上述方法定义一个decorator方法时,函数体内的额外操作只在被装饰的函数首次调用时执行,如果要保证额外操作在每次调用被装饰的函数时都执行,需要换成如下的写法:

1

2

3

4

5

6

7

8

9

10

11

defdeco(func):

defreplaceFunc():#定义一个内嵌函数,此函数包装了被装饰的函数,并提供额外操作的代码

print"Enter decorator" #进行额外操作

returnfunc()#产生对被装饰函数的调用

returnreplaceFunc#由于返回的是这个新的内嵌函数,所以确保额外操作每次调用得以运行

@deco

defMyFunc():#应用@deco修饰的方法

print"Enter MyFunc"

MyFunc()#调用被装饰的函数

有参数decorator:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

defdecoWithArgs(arg):

"""由于有参数的decorator函数在调用时只会使用应用时的参数而不接收被装饰的函数做为参数,

所以必须返回一个decorator函数, 由它对被装饰的函数进行封装处理"""

defnewDeco(func):#定义一个新的decorator函数

defreplaceFunc():#在decorator函数里面再定义一个内嵌函数,由它封装具体的操作

print"Enter decorator" #进行额外操作

returnfunc()#对被装饰函数进行调用

returnreplaceFunc

returnnewDeco#返回一个新的decorator函数

@decoWithArgs("demo")

defMyFunc():#应用@decoWithArgs修饰的方法

print"Enter MyFunc"

Myfunc()#调用被装饰的函数

当我们对某个方法应用了装饰方法后, 其实就改变了被装饰函数名称所引用的函数代码块入口点,使其重新指向了由装饰方法所返回的函数入口点。由此我们可以用decorator改变某个原有函数的功能,添加各种操作,或者完全改变原有实现。

http://www.lbrq.cn/news/1094977.html

相关文章:

  • 免费建设个人手机网站/五年级上册语文优化设计答案
  • 企业网站托管服务公司/武汉seo首页优化技巧
  • 苍山网站建设/百度关键词价格怎么查询
  • 网站备案的坏处/seo排名点击软件
  • wordpress主标题副标题/石家庄百度快照优化排名
  • 陕西富国建设工程有限公司网站/百度推广客户端app下载
  • 向日葵视频在线免费观看/sem与seo的区别
  • 天津单位网站建设/b站推广形式
  • 帮做ppt网站/专业网络推广
  • 大学做网站/软文营销常用的方式是什么
  • 网站首页设计定位/数据分析师培训需要多少钱
  • 有哪些做二手的网站/廊坊seo网站管理
  • axure rp可以做网站吗/近一周新闻热点事件
  • 下载app安装到手机上/重庆seo教程
  • 学校网站模板注意事项/重庆seo网站
  • 潍坊个人做网站的公司/最近的国内新闻
  • 如何做印刷报价网站/百度提交
  • 重庆餐饮网站建设/网络营销推广渠道
  • Pc端做社区网站用什么框架/seo推广收费标准
  • 免费建设网站的方法/成都网络营销公司
  • 网站建设标准 方案书/百度快速收录seo工具软件
  • 网站建设编辑器/凡科建站怎么用
  • 外贸建站推广/他达拉非片正确服用方法
  • 非法网站开发是什么意思/网站seo排名培训
  • 为什么选php语言做网站/黑帽seo排名技术
  • 做的网站没流量/在线葡京在线葡京
  • 江门网站建设工作/今日舆情热点
  • 网站登录系统源码/关键词优化包年推广
  • 用wordpress做的网站有哪些/搜狗搜索引擎网页
  • 做基金的网站哪个好/嘉兴百度seo
  • C# 基于halcon的视觉工作流-章23-圆查找
  • Day 21: 常见的降维算法
  • Microsoft-DNN NTLM暴露漏洞复现(CVE-2025-52488)
  • 使用爬虫获取游戏的iframe地址
  • Java 大视界 -- Java 大数据在智能教育自适应学习路径规划与学习效果强化中的应用(362)
  • 调节广告adload的算法:Contextual Bandits、多臂老虎机 Policy Gradient、Q-learning