python中self_一个例子带你入门Python装饰器
============
欢迎关注我的公众号:早起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装饰器相关推荐
- 用几个最简单的例子带你入门 Python 爬虫
作者 | ZackSock 来源 | 新建文件夹X(ID:ZackSock) 头图 | CSDN下载自视觉中国 前言 爬虫一直是Python的一大应用场景,差不多每门语言都可以写爬虫,但是程序员们却独 ...
- 图解爬虫,用几个最简单的例子带你入门Python爬虫
一.前言 爬虫一直是Python的一大应用场景,差不多每门语言都可以写爬虫,但是程序员们却独爱Python.之所以偏爱Python就是因为她简洁的语法,我们使用Python可以很简单的写出一个爬虫程序 ...
- python的装饰器迭代器与生成器_详解python中的生成器、迭代器、闭包、装饰器
迭代是访问集合元素的一种方式.迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 1|1可迭代对象 以直接作用于 for ...
- python中的迭代器,生成器,闭包,装饰器,@property
一.迭代器 迭代器在Python中无处不在.它们在for循环,理解,生成器等中优雅地实现,但却隐藏在眼皮底下. Python中的Iterator只是一个可以迭代的对象.一个将返回数据的对象,一次返回一 ...
- Python 中的闭包、匿名函数、decorator 装饰器与python的偏函数
Python中的闭包 def calc_sum(lst):def lazy_sum():return sum(lst)return lazy_sum 像这种内层函数引用了外层函数的变量(参数也算变量) ...
- python中面向切片编程(AOP)和装饰器
@函数名(类的描述符)相当于fuc = decorator(fuc) 装饰器: def deco(fuc):print('============')return fuc @deco def foo( ...
- 第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析
一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法gette ...
- python中字典是什么类型_Python入门-Python中的基本数据类型-dictionary(字典)
字典是一种映射类型,字典用"{ }"标识,它是一个无序的"键(key) : 值(value)"对集合."键(key)"必须使用不可变类型,如 ...
- c++定义一个动态对象数组_如何在Python中自定义一个可被调用的对象实例?
前言 在关于Python描述符函数的详解三篇中,我们有提到如何基于类创建一个"描述符函数",之所以能够基于类创建这样一个概念,是因为用到了类中的__call__属性,从前述文章中可 ...
最新文章
- 实验——Windows常用网络测试命令
- 如何在Linux上制作一个屏幕录像视频教程
- ajax请求携带tooken_9 HTMLJS等前端知识系列之Ajax post请求带有token向Django请求
- (24)System Verilog设计十进制计数器
- android:fillviewport=true 不起作用,无法在android模拟器中滚动
- PSP3000破解原理——缓冲区溢出漏洞随谈
- 傅里叶分析斯坦恩中文版pdf_傅里叶分析
- 随机森林回归预测_jupyter notebook
- HeartBeat的一些介绍和功能上的一些总结
- 程序媛秋招心得及面试经验分享
- TabLayout 之改变 Indicator 的宽度
- 品牌对比 蜜雪冰城 VS 喜茶
- 止疼药-盐酸羟考酮缓释片//2021-2-20
- 如何进入docker系统
- Python实现BT种子转化为磁力链接【实战】
- LTE CA带宽能力(CA bandwidth classes)规定了聚合带宽限制,见36.101中表格Table 5.6A-1
- ikeas电子商务在covid 19时期就已经很糟糕了,它绝对崩溃了
- 相机跟频闪灯(LAMP-S25)、爆闪灯(LAMP-F25)、频爆一体灯(LAMP-SF25)信号线如何连接?
- wsus无法同步计算机,搭建WSUS服务,无法同步到微软上游服务器
- 用友软件出错解决方案。如:SA口令被更改或系统错误,系统将退出 错误编号:-2147024770错误描述:Automation 错误
热门文章
- mysql source导入报错ERROR 1366的解决方法
- 使用Navicat连接MySQL时出现2059报错的解决方法
- 解决Linux安装 VMware tools 工具的方法
- mysql8.0.18ZIP版下载与安装(以及无my-default.ini文件和data文件夹的解决方法)
- No qualifying bean of type xxx‘ available 的一种解决方法
- 如何获取本地安装的Python模块列表?
- struts2_对Map进行双层迭代
- mysql七:视图、触发器、事务、存储过程、函数
- rpm安装mysql图文
- 《交互式程序设计 第2版》一2.7 作用域