Python里的@

函数修饰器:
python里面使用@作为函数的修饰符,主要用在某块或者类里面对函数进行修饰。出现在函数名字上一行。
例如,要测试一个函数的运行时间,测试的函数又不要写在函数内部,则可以用下面的方法。
第一种:@函数名

import timedef times_long(fn):def get_time(*args):start = time.time()num = args[0]print("this is start!", num)fn(*args)end = time.time()print("this is end!", end - start)return fn(2*num)return get_time@times_long
def sum_a(m):time.sleep(m)print("this is sum_a!", m)sum_a(4)
#输出
# this is start! 4
# this is sum_a! 4
# this is end! 4.000227212905884
# this is sum_a! 8

解释:
可以看到先执行测时间的函数,然后在测时间的函数内部调用了本函数,然后测时间的函数结束后,再执行本来应该执行的函数。return fn(2*num)表示返回后还需要执行sum_a, 如果不是返回同名函数,那么就不执行sum_a

第二种
@staticmethos:静态函数

class Demo:def print_all(self, name):print(name)@classmethoddef print_all2(name):print(name)

是不依赖于类函数的变量属性的一类函数

@classmethod:类函数
修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。

class A(object):bar = 1def func1(self):  print ('foo') @classmethoddef func2(cls):print ('func2')print (cls.bar)cls().func1()   # 调用 foo 方法A.func2()   # 不需要实例化

@property:类属性
例子:
在python中双下划线是私有变量,外部不能直接访问

class Person(object):def __init__(self, name, age):self.__name = nameself.__age = agedef get_age_fun(self):return self.__agedef set_age_fun(self, value):if not isinstance(value, int):raise ValueError('年龄必须是数字!')if value < 0 or value > 100:raise ValueError('年龄必须是0-100')self.__age = valuedef print_info(self):print('%s: %s' % (self.__name, self.__age))p = Person('balala',20)
p.__age = 17
print(p.__age) # 17
print(p.get_age_fun()) # 20 表面上看,上面代码“成功”地设置了__age变量 17,但实际上这个__age变量和class内部的__age变量不是一个变量!
# 内部的__age变量已经被Python解释器自动改成了_Person_age,而外部代码给p新增了一个__age变量。 所以调用 get_age_fun输出的是初始值
p.set_age_fun(35)
print(p.get_age_fun()) # 35
print(p.print_info()) # balala: 35

当我们稍作修改,将私有变量变为单下划线,就成为全局变量,公有变量

class Person(object):def __init__(self, name, age):self.__name = nameself._age = agedef get_age_fun(self):return self._agedef set_age_fun(self, value):if not isinstance(value, int):raise ValueError('年龄必须是数字!')if value < 0 or value > 100:raise ValueError('年龄必须是0-100')self._age = valuedef print_info(self):print('%s: %s' % (self.__name, self._age))p = Person('balala',20)
p._age = 17
print(p._age) # 17
print(p.get_age_fun()) # 这里是17 不再是 20,因为此时_age是全局变量,外部直接影响到类内部的更新值
p.set_age_fun(35)
print(p.get_age_fun()) # 35
print(p.print_info()) # balala: 35

当我们使用@property可以将函数作为属性访问,不加括号,如:

class Person(object):def __init__(self, name, age):self.__name = nameself.__age = age@propertydef get_age_fun(self):return self.__age@get_age_fun.setter # get_age_fun是上面声明的方法def set_age_fun(self, value):if not isinstance(value, int):raise ValueError('年龄必须是数字!')if value < 0 or value > 100:raise ValueError('年龄必须是0-100')self.__age = valuedef print_info(self):print('%s: %s' % (self.__name, self.__age))p = Person('balala',20)
p.__age = 17
print(p.__age) # 17
print(p.get_age_fun) # 20 注意这里不带()
#p.set_age_fun(35) 注意不能这样调用赋值了
p.set_age_fun = 35 #  这里set_age_fun 就是 声明的函数不带()
print(p.get_age_fun) # 35
print(p.print_info()) # balala: 35

参考

001 菜鸟
002 cnblog

Python里的@如何使用相关推荐

  1. 一篇长文带你在python里玩转Json数据

    Json简介 Json(JavaScript Object Notation) 很多网站都会用到Json格式来进行数据的传输和交换. 这因为Json是一种轻量级的数据交换格式,具有数据格式简单,读写方 ...

  2. 下列哪个不是目前python里的内置模块-python中那些小众但有用的内置模块

    今天带来的是python里一些小众但是却比较实用的python库,一起来看看吧! pprint:更清晰的打印 pprint 是 pretty printer 的缩写,用来打印 Python 数据结构, ...

  3. python中的format什么意思中文-python里format什么意思

    format是python2.6新增的一个格式化字符串的方法,相对于老版的%格式方法,它有很多优点. 1.不需要理会数据类型的问题,在%方法中%s只能替代字符串类型(推荐学习:Python视频教程) ...

  4. python能绘制统计图吗-特征锦囊:常用的统计图在Python里怎么画?

    今日锦囊 常用的统计图在Python里怎么画? 这里的话我们介绍几种很简单但也很实用的统计图绘制方法,分别有条形图.饼图.箱体图.直方图以及散点图,关于这几种图形的含义这边就不多做解释了. 今天用到两 ...

  5. python装饰器类-PYTHON里的装饰器能装饰类吗

    扩展回答 如何理解python里的装饰器 通常可以理解它是一个hook 的回调函数. 或者是理解成python 留给二次开发的一个内置API. 一般是用回调和hook 方式实现的. 如何理解Pytho ...

  6. python里unexpected eof while parsing_使用Python编程时的10个注意事项

    01初始变化量 在Python里,一个表达式中的名字在它被赋值之前是没法使用的.这是有意而为的:这样能避免一些输入失误,同时也能避免默认究竟应该是什么类型的问题(0,None,"" ...

  7. python nlp包_StanfordNLP,让你在 Python 里一手掌握 53 种自然语言分析

    发表日期:2019-06-12 StanfordNLP,让你在 Python 里一手掌握 53 种自然语言分析 -- 不久之前,斯坦福大学公开了它最新的自然语言处理代码库-- StanfordNLP. ...

  8. Python里的dict和set的背后小秘密

    Python里的dict和set的效率有多高? 为什么它们是无序的? 为什么并不是所有的Python对象都可以当作dict的键或set里的元素? 为什么dict的键和set的元素的顺序是根据它们被添加 ...

  9. 为什么在Python里推荐使用多进程而不是多线程?(为什么python多线程无法增加CPU使用率?)...

    最近在看Python的多线程,经常我们会听到老手说:"Python下多线程是鸡肋,推荐使用多进程!",但是为什么这么说呢? 要知其然,更要知其所以然.所以有了下面的深入研究: 首先 ...

  10. python pywin32 微信_Pywin32错误地安装进Anaconda的Python里了

    Pywin32是Python的Windows扩展文件 最近打算学 Scrapy,所以需要配置好环境和安装一些依赖库,之前安装 wheel.lxml.PyOpenssl.Twisted 这些间接或直接的 ...

最新文章

  1. Access 数据库连接字符串 (有密码)
  2. 设为首页加入收藏代码
  3. mysql按某一字段分组取最大(小)值所在行的数据
  4. 科大星云诗社动态20210521
  5. QML基础类型之vector3d
  6. leetcode 321. 拼接最大数(单调栈)
  7. 19.为什么要用异步框架,它解决什么问题?
  8. qt中的信号都需要emit触发吗_[Vue笔记] $emit 与 $event
  9. Java-重复性代码统计第一篇
  10. [Python从零到壹] 三十四.OpenCV入门详解——显示读取修改及保存图像
  11. 【智衡跨境电商shopee运营】Shopee平台流量入口有哪些?
  12. arcgis 发布服务
  13. 【C++】pcl中的简单点云可视化
  14. swfobject2.2参数详解(swfobject.embedSWF)
  15. MySQL阶段二_模块6
  16. 大数据技术Flink详解
  17. Gem5模拟器,详解官网教程的statistics and output(三)
  18. 爬虫跳过https安全认证
  19. Object Detection in 20 years:A Survey 整理
  20. ubuntu14.04的自带的拼音输入法问题

热门文章

  1. bzoj 2245(费用流)
  2. 解析自动驾驶核心技术产业链未来市场布局
  3. Halcon视觉软件库介绍
  4. fastjson的JSONObject数据保证顺序
  5. 怎么添加附件链接到微信公众号推文
  6. 简单认识Apache Lucene的使用
  7. Apple PUSH Notication Service (APNS) 配置攻略
  8. 函数凹凸性与黑塞矩阵
  9. 我看你骨骼惊奇,送你本武林秘籍--《三子棋至多子棋的扩展》
  10. 假显卡测试软件,GPU-Z 2.26.0发布:可检测多款假冒显卡