Python里的@如何使用
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里的@如何使用相关推荐
- 一篇长文带你在python里玩转Json数据
Json简介 Json(JavaScript Object Notation) 很多网站都会用到Json格式来进行数据的传输和交换. 这因为Json是一种轻量级的数据交换格式,具有数据格式简单,读写方 ...
- 下列哪个不是目前python里的内置模块-python中那些小众但有用的内置模块
今天带来的是python里一些小众但是却比较实用的python库,一起来看看吧! pprint:更清晰的打印 pprint 是 pretty printer 的缩写,用来打印 Python 数据结构, ...
- python中的format什么意思中文-python里format什么意思
format是python2.6新增的一个格式化字符串的方法,相对于老版的%格式方法,它有很多优点. 1.不需要理会数据类型的问题,在%方法中%s只能替代字符串类型(推荐学习:Python视频教程) ...
- python能绘制统计图吗-特征锦囊:常用的统计图在Python里怎么画?
今日锦囊 常用的统计图在Python里怎么画? 这里的话我们介绍几种很简单但也很实用的统计图绘制方法,分别有条形图.饼图.箱体图.直方图以及散点图,关于这几种图形的含义这边就不多做解释了. 今天用到两 ...
- python装饰器类-PYTHON里的装饰器能装饰类吗
扩展回答 如何理解python里的装饰器 通常可以理解它是一个hook 的回调函数. 或者是理解成python 留给二次开发的一个内置API. 一般是用回调和hook 方式实现的. 如何理解Pytho ...
- python里unexpected eof while parsing_使用Python编程时的10个注意事项
01初始变化量 在Python里,一个表达式中的名字在它被赋值之前是没法使用的.这是有意而为的:这样能避免一些输入失误,同时也能避免默认究竟应该是什么类型的问题(0,None,"" ...
- python nlp包_StanfordNLP,让你在 Python 里一手掌握 53 种自然语言分析
发表日期:2019-06-12 StanfordNLP,让你在 Python 里一手掌握 53 种自然语言分析 -- 不久之前,斯坦福大学公开了它最新的自然语言处理代码库-- StanfordNLP. ...
- Python里的dict和set的背后小秘密
Python里的dict和set的效率有多高? 为什么它们是无序的? 为什么并不是所有的Python对象都可以当作dict的键或set里的元素? 为什么dict的键和set的元素的顺序是根据它们被添加 ...
- 为什么在Python里推荐使用多进程而不是多线程?(为什么python多线程无法增加CPU使用率?)...
最近在看Python的多线程,经常我们会听到老手说:"Python下多线程是鸡肋,推荐使用多进程!",但是为什么这么说呢? 要知其然,更要知其所以然.所以有了下面的深入研究: 首先 ...
- python pywin32 微信_Pywin32错误地安装进Anaconda的Python里了
Pywin32是Python的Windows扩展文件 最近打算学 Scrapy,所以需要配置好环境和安装一些依赖库,之前安装 wheel.lxml.PyOpenssl.Twisted 这些间接或直接的 ...
最新文章
- Access 数据库连接字符串 (有密码)
- 设为首页加入收藏代码
- mysql按某一字段分组取最大(小)值所在行的数据
- 科大星云诗社动态20210521
- QML基础类型之vector3d
- leetcode 321. 拼接最大数(单调栈)
- 19.为什么要用异步框架,它解决什么问题?
- qt中的信号都需要emit触发吗_[Vue笔记] $emit 与 $event
- Java-重复性代码统计第一篇
- [Python从零到壹] 三十四.OpenCV入门详解——显示读取修改及保存图像
- 【智衡跨境电商shopee运营】Shopee平台流量入口有哪些?
- arcgis 发布服务
- 【C++】pcl中的简单点云可视化
- swfobject2.2参数详解(swfobject.embedSWF)
- MySQL阶段二_模块6
- 大数据技术Flink详解
- Gem5模拟器,详解官网教程的statistics and output(三)
- 爬虫跳过https安全认证
- Object Detection in 20 years:A Survey 整理
- ubuntu14.04的自带的拼音输入法问题