美文网首页
python修饰符@初识

python修饰符@初识

作者: bonnie_xing | 来源:发表于2019-07-12 16:51 被阅读0次

一、关于@的初步使用

1. 实例代码

def f1(arg):
    print("f1")
    rl = arg()
    print(rl)
    return rl + "f1"


@f1
def f2(arg=""):
    print("f2")
    return arg + "f2r"

print("start")
print(f2)
# print(f2("1"))
# print(f1(None))

2. 输出

f1
f2
f2r
start
f2rf1

3. 说明

在执行前,先对@进行解析所以会在start之前输出f1、f2、f2r
print(f2):实际执行的是f1(f2)
后面两个函数会报错。
print(f2("1"))报错:因为通过@已经将f2转化为字符串,无法传入字符串参数

TypeError: 'str' object is not callable

print(f1(None))报错:因为在调用传入arg参数的fun时,None不能callable

TypeError: 'NoneType' object is not callable

二、class中使用@

1. 实例代码

class myDecorator(object):

    def __init__(self, f):
        print ("inside myDecorator.__init__()")
        self.f = f

    def __call__(self):
        print ("inside myDecorator.__call__()")
        self.f()

@myDecorator
def aFunction():
    print ("inside aFunction()")

print ("Finished decorating aFunction()")

aFunction()

2. 输出

inside myDecorator.__init__()
Finished decorating aFunction()
inside myDecorator.__call__()
inside aFunction()

3. 说明

将 aFunction 函数做为myDecorator类的参数传入
在函数定义时,创建myDecorator的实例

三、fun中使用@

1. 实例代码

def entryExit(f):
    def new_f():
        print ("Entering", f.__name__)
        f()
        print ("Exited", f.__name__)
    return new_f

@entryExit
def func1():
    print ("inside func1()")

func1()

2. 输出

Entering func1
inside func1()
Exited func1

3.说明

将func1做为参数掺入到entryExit函数中
在调用func1时,实际是调用的entryExit(func1)

相关文章

网友评论

      本文标题:python修饰符@初识

      本文链接:https://www.haomeiwen.com/subject/gksykctx.html