python描述器descriptor_python装饰器decorator、描述器descriptor

背景

image.png

装饰器decorator

返回值为另一函数的函数,通常使用 @wrapper语法。 装饰器的常见例子包括

装饰器语法只是一种语法快捷方式,以下两个函数定义在语义上完全等价:

def f(...):

...

f = staticmethod(f)

@staticmethod

def f(...):

...

同的样概念也适用于类,但通常较少这样使用。有关装饰器的详情可参见 函数定义 和 类定义 的文档。示例1:

def test(f):

print("before ...")

f()

print("after ...")

@test

def func():

print("func was called")

执行结果

before ...

func was called

after ...

Python解释器读到函数修饰器“@”的时候,后面步骤会是这样了:去调用 test函数,test函数的入口参数就是那个叫“func”的函数;

test函数被执行,入口参数的(也就是func函数)会被调用(执行);示例2:

def funcA(A):

print("function A")

def funcB(B):

print(B(2))

print("function B")

@funcA

@funcB

def func(c):

print("function C")

return c**2

执行结果

function C

4

function B

function A

这个例子告诉我们func有两个装饰器,是从下网上调用的。

注意:函数先定义,再修饰它;反之会编译器不认识;

修饰符“@”后面必须是之前定义的函数或类;

每个函数可以有多个修饰符。

参考资料

描述器descriptor

任何定义了 a.b 来获取、设置或删除属性时会在 a 的类字典中查找名称为 b 的对象,但如果 b 是描述器,则会调用对应的描述器方法。理解描述器的概念是更深层次理解 Python 的关键,因为这是许多重要特性的基础,包括函数、方法、属性、类方法、静态方法以及对超类的引用等等。

有关描述符的方法的详情可参看 实现描述器。

class property(fget=None, fset=None, fdel=None, doc=None)

fget 是获取属性值的函数。 fset 是用于设置属性值的函数。 fdel 是用于删除属性值的函数。并且 doc 为属性对象创建文档字符串。

class C():

def __init__(self):

self._x = None

def getx(self):

return self._x

def setx(self, value):

self._x = value

def delx(self):

del self._x

x = property(getx, setx, delx, "I'm the 'x' property.")

demo = C()

demo.x = 5

print(demo.x)

print(demo.getx())

执行结果

5

5

更快捷的方式:

class C():

def __init__(self):

self._x = None

@property

def x(self):

"""I'm the 'x' property."""

return self._x

@x.setter

def x(self, value):

self._x = value

@x.deleter

def x(self):

del self._x

demo = C()

demo.x = 5

print(demo.x)

@property 装饰器会将 x() 方法转化为同名的只读属性的 "getter",并将 x的文档字符串设置为 "I'm the 'x' property."

执行结果

5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值