============

欢迎关注我的公众号:早起python

============

前言

在还未正式发布的python3.9中,有一个新功能值得关注,那就是任意表达式可以作为装饰器,如果你还不知道装饰器是什么,没关系,跟着本文一个例子搞明白,不过需要你对Python中的类(Class)有一定的了解,因为我们一般在类中使用。

一个例子

关于装饰器是什么,随便一搜都能找到一堆解释。我们让那些看着头疼的名词、定义去一边吃灰,看下面这个例子

class Blog():def __init__(self,name,title):self.author = nameself.article = titleself.information = self.author + ' ' + self.articledef url(self):return f"The author url is {self.author}.{self.article}.com "

这段代码不难理解吧,定义了一个Blog类,这个类包含author、article、information属性,并拥有一个url方法。

现在我们来创建一个实例

>>> user = Blog('liuzaoqi','Python')

这行代码不难看懂吧,创建了一个user,姓名是liuzaoqi,标题是Python。OK现在来打印一下相关属性

>>> print(user.author)
#liuzaoqi
>>> print(user.article)
#Python
>>> print(user.information)
#liuzaoqi Python
>>> print(user.url())
#The author url is liuzaoqi.Python.com

没问题吧,到目前为止还与装饰器没啥太大关系,现在问题来了,如果我想修改这个user的article,这样写可以吧

>>> user.article = 'study'
>>> print(user.article)
>>> print(user.information)
>>> print(user.url())

来猜一下结果,我们将article修改了:将'Python'改为'study'

而information与url都与article有关,因此它们都应该随之修改,来看看结果

study
liuzaoqi Python
The author url is liuzaoqi.study.com

你神奇的事情发生了,都是由article生成的,但是只有url修改了,information并没有发生变化,这是因为:在Python中如果我们更改了类中的一个属性的值,那么从刚刚更改的属性生成的其他属性不会自动更新。

那要怎么解决呢?我们注意到url能够正确的改变,那我们将information由属性改为方法不就OK了,因此代码就改成了这样

class Blog():def __init__(self,name,title):self.author = nameself.article = titledef information(self):return self.author + ' ' + self.articledef url(self):return f"The author url is {self.author}.{self.article}.com "

能看懂吧,不就是将information由属性改为方法,现在再来试一下

>>> user = Blog('liuzaoqi','Python')
>>> print(user.information())
#liuzaoqi Python
>>> user.article = 'study'
>>> print(user.information())
#liuzaoqi study

还是同样的操作,但是现在information就可以随着article修改而自动更新了。

等等,到这里好像与装饰器没啥关系啊。但是你有没有发现,我们之前调用information使用的是user.information但是现在变成了user.information(),多了一个(),别小瞧这个括号,如果我们正在开发一个大型项目,那么我们这样一修改,哦吼,所有使用了user.information的代码都将崩溃。

这是就需要装饰器登场了,Python中内置装饰器@property可以在方法的定义之前添加装饰器将方法转换为属性

class Blog():def __init__(self,name,title):self.author = nameself.article = title@propertydef information(self):return self.author + ' ' + self.articledef url(self):return f"The author url is {self.author}.{self.article}.com "

不用仔细看,就加了一句@property在方法上面,OK,现在再来看看

>>> user = Blog('liuzaoqi','Python')
>>> print(user.information)
#liuzaoqi Python
>>> user.article = 'study'
>>> print(user.information)
#liuzaoqi study

现在我们就能使用访问属性的方法来调用information,这就是装饰器,它就是负责把一个方法变成属性调用。但是这是可能还有一个问题,现在修改name、article之后information会自动更新,但是如果我们修改information属性则name和article自动更新吗,就像这样

>>> user.information = 'zaoqi python'
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-57-00cd34ab7d23> in <module>
----> 1 user.information = 'zaoqi python'AttributeError: can't set attribute

很遗憾,并不能如我们预想的一样,当然解决这个问题并不困难,使用setter/deleter方法就可以,这会在之后的文章中讲解,至少读到这里我们已经学会装饰器是个什么玩意,不是吗?

python中self_一个例子带你入门Python装饰器相关推荐

  1. 用几个最简单的例子带你入门 Python 爬虫

    作者 | ZackSock 来源 | 新建文件夹X(ID:ZackSock) 头图 | CSDN下载自视觉中国 前言 爬虫一直是Python的一大应用场景,差不多每门语言都可以写爬虫,但是程序员们却独 ...

  2. 图解爬虫,用几个最简单的例子带你入门Python爬虫

    一.前言 爬虫一直是Python的一大应用场景,差不多每门语言都可以写爬虫,但是程序员们却独爱Python.之所以偏爱Python就是因为她简洁的语法,我们使用Python可以很简单的写出一个爬虫程序 ...

  3. python的装饰器迭代器与生成器_详解python中的生成器、迭代器、闭包、装饰器

    迭代是访问集合元素的一种方式.迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 1|1可迭代对象 以直接作用于 for ...

  4. python中的迭代器,生成器,闭包,装饰器,@property

    一.迭代器 迭代器在Python中无处不在.它们在for循环,理解,生成器等中优雅地实现,但却隐藏在眼皮底下. Python中的Iterator只是一个可以迭代的对象.一个将返回数据的对象,一次返回一 ...

  5. Python 中的闭包、匿名函数、decorator 装饰器与python的偏函数

    Python中的闭包 def calc_sum(lst):def lazy_sum():return sum(lst)return lazy_sum 像这种内层函数引用了外层函数的变量(参数也算变量) ...

  6. python中面向切片编程(AOP)和装饰器

    @函数名(类的描述符)相当于fuc = decorator(fuc) 装饰器: def deco(fuc):print('============')return fuc @deco def foo( ...

  7. 第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析

    一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法gette ...

  8. python中字典是什么类型_Python入门-Python中的基本数据类型-dictionary(字典)

    字典是一种映射类型,字典用"{ }"标识,它是一个无序的"键(key) : 值(value)"对集合."键(key)"必须使用不可变类型,如 ...

  9. c++定义一个动态对象数组_如何在Python中自定义一个可被调用的对象实例?

    前言 在关于Python描述符函数的详解三篇中,我们有提到如何基于类创建一个"描述符函数",之所以能够基于类创建这样一个概念,是因为用到了类中的__call__属性,从前述文章中可 ...

最新文章

  1. 实验——Windows常用网络测试命令
  2. 如何在Linux上制作一个屏幕录像视频教程
  3. ajax请求携带tooken_9 HTMLJS等前端知识系列之Ajax post请求带有token向Django请求
  4. (24)System Verilog设计十进制计数器
  5. android:fillviewport=true 不起作用,无法在android模拟器中滚动
  6. PSP3000破解原理——缓冲区溢出漏洞随谈
  7. 傅里叶分析斯坦恩中文版pdf_傅里叶分析
  8. 随机森林回归预测_jupyter notebook
  9. HeartBeat的一些介绍和功能上的一些总结
  10. 程序媛秋招心得及面试经验分享
  11. TabLayout 之改变 Indicator 的宽度
  12. 品牌对比 蜜雪冰城 VS 喜茶
  13. 止疼药-盐酸羟考酮缓释片//2021-2-20
  14. 如何进入docker系统
  15. Python实现BT种子转化为磁力链接【实战】
  16. LTE CA带宽能力(CA bandwidth classes)规定了聚合带宽限制,见36.101中表格Table 5.6A-1
  17. ikeas电子商务在covid 19时期就已经很糟糕了,它绝对崩溃了
  18. 相机跟频闪灯(LAMP-S25)、爆闪灯(LAMP-F25)、频爆一体灯(LAMP-SF25)信号线如何连接?
  19. wsus无法同步计算机,搭建WSUS服务,无法同步到微软上游服务器
  20. 用友软件出错解决方案。如:SA口令被更改或系统错误,系统将退出 错误编号:-2147024770错误描述:Automation 错误

热门文章

  1. mysql source导入报错ERROR 1366的解决方法
  2. 使用Navicat连接MySQL时出现2059报错的解决方法
  3. 解决Linux安装 VMware tools 工具的方法
  4. mysql8.0.18ZIP版下载与安装(以及无my-default.ini文件和data文件夹的解决方法)
  5. No qualifying bean of type xxx‘ available 的一种解决方法
  6. 如何获取本地安装的Python模块列表?
  7. struts2_对Map进行双层迭代
  8. mysql七:视图、触发器、事务、存储过程、函数
  9. rpm安装mysql图文
  10. 《交互式程序设计 第2版》一2.7 作用域