python装饰器 property_由 @property 引起的对 Python 装饰器(Decorator)的学习

本文介绍了Python中的装饰器,包括不带参数和带参数的装饰器的定义与使用方式,以及如何使用多个装饰器。同时,通过一个示例展示了如何使用装饰器记录函数调用时间。此外,还讲解了@property装饰器,用于将函数转化为类的只读属性,并展示了如何创建可读写的属性。最后,强调了在使用@property时,所在类需要继承自object。
摘要由CSDN通过智能技术生成

今天看别人的代码遇到了@property,让我不由想起Java中的注解,难道Python中也有这东西?

经过一番查找,在Python中这个叫做装饰器(Decorator)。

一、装饰器的基本知识

1. 装饰器有两种:不带参数的装饰器,带参数的装饰器。

2. 分别用一句话来描述这两种装饰器:不带参数的装饰器是一个用来装饰函数的以该函数为参数的函数;带参数的装饰器是一个返回一个用来装饰函数的以该函数为参数的函数(或者说是一个返回不带参数装饰器的函数)。嘿嘿,有点拗口哈,不过貌似确实是这样的,求指导……

3. 当然,不管是带参数还是不带参数的装饰器,都需要返回一个函数,在调用被装饰的函数的时候,实际上调用的就是装饰器返回的函数。

4. 不带参数的装饰器:

定义:

def deco(func):

.......

使用:

@deco

def foo():

pass

Python的处理方式:

foo=deco(foo)

5. 带参数的装饰器:

定义:

def deco(args):

......

使用:

@deco(args)

def foo():

pass

Python的处理方式:

foo = deco(args)(foo)

6. 使用多个装饰器,如:

① 不带参数的装饰器

@deco1

@deco2

def foo():

pass

Python的处理方式是:

foo = deco1(deco2(foo))

② 带参数的装饰器

@deco1

@deco2(args)

def foo():

pass

Python的处理方式是:

foo = deco1(deco2(args)(foo))

7. 一个装饰器的例子,实现了打印函数调用的时间:

from time import ctime

def printCallTime(func):

def decoratedFunc():

print '[%s] %s() is called.' % (ctime(),func.__name__)

func()

return decoratedFunc

@printCallTime

def myFunc():

pass

myFunc()

代码执行后会输出:

[Fri Mar 08 13:23:27 2013] myFunc() is called.

8. 学习了装饰器的基本知识,回到最开始的@property,通过文档我了解到,它的作用是将一个函数作为类的一个属性来访问。如:

class Parrot(object):

def __init__(self):

self._voltage = 100000

@property

def voltage(self):

"""Get the current voltage."""

return self._voltage

这样就为类Parrot定义了一个只读属性voltage,如果p是Parrot的一个实例,那我我们就可以通过p.voltage来访问到voltage函数的返回值,如果想让该属性可写:

@voltage.setter

def voltage(self, value):

self._voltage = value

9. 扩展

在Python3.0之前有old-style class 和new-style class之分,帮助文档中是这样介绍new-style class的:

new-style classAny class which inherits from . This includes all built-in types like and . Only new-style classes can use Python’s newer, versatile features like , descriptors, properties, and .

也就是说继承自object的类才是new-style class 而且只有new-style class 才能设置属性,也即是说使用@property的时候,所在的类必须是继承自object的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值