🌈个人主页:羽晨同学
💫个人格言:“成为自己未来的主人~”
函数装饰器的使用方法
我们首先来定义一个普通的函数。
# 装饰器使用方法
def outter(func):
print("outter-------start",func)
def inner():
print("inner-----start")
func()
print("new---------")
print("inner------end-------")
print("outter--------end-----")
return inner
我们接下来再来看一下用函数装饰器装饰之后的函数。
@outter
def my_print():
print("拼搏到无能为力-------")
这个函数使用函数装饰器装饰之后的,接下来,如果我们对他进行调用,那么会发生什么呢?让我们来看一下。
你看,这是我们代码运行的结果,这个结果说明了什么呢?
其实,这个执行结果告诉了我们当我们使用装饰器的时候,这个@outter就是对我们刚才定义的outter函数进行了调用,所以会打印出这样的结果。
我们可以来打印一下这个my_print的类型。
print(my_print)
下面是我们执行出来的结果。
这个结果就是my_print的类型。
如果我们对这个函数进行调用,可以看一下会出来什么样的结果。
这个结果说明了什么?
当我们调用这个装饰器的时候,我们会调用装饰器所定义的那个函数里面的内部函数,并且,装饰器修饰的这个函数会作为参数传入到所定义的那个函数里面作为形参。
同一个装饰器,同时装饰多个函数。
注意:如果同一个装饰器装饰多个不同的函数,为了适配所有的函数,给装饰器的内部函数设置不定长参数。
比如说,看下面的这部分代码。
def outter(func):
def inner(*args,**kwargs):
func(*args,**kwargs) # 拆包,调用原函数,注意传参问题
print("new---------")
return inner
@outter
def a():
print("aaaa")
@outter
def b(num1,num2):
print("bbbbbbb",num1,num2)
@outter
def c(x,y,z,num):
print('ccc',x,y,z,num)
a()
b(1,2)
c(1,2,3,4)
我们传入的参数会不止有一个参数。
这个,是我们代码的运行结果,我们来分析一下这个代码的运行过程。
其实就是,不管我们传入多少参数,设置不定长参数的话就可以进行传入。
下面我们来谈一下,python中的系统模块的部分。
系统模块,是python中自带的一些模块,我们在使用的过程中,可以直接导入使用。
比如,下面的这些模块。
import random
import math
import string
import functools
自定义模块的使用,我们自己封装一个模块出来,这个模块实现了一些特殊的功能。
注意1:一个.py文件就是一个模块,.py文件的文件名相当于模块名。
所以,一个合法的模块必须遵循标识符的规则和规范。
注意2:包,本质是一个文件夹,但是又区别于普通的文件夹,其中包含一个__init__.py
注意3:包的存在和文件夹的存在,原理是一样的,都是为了管理文件。
注意4:在导入自定义模块时,需要注意模块的路径问题,需要将模块所在的包或文件夹声明,所以需要使用相对路径来表示。
注意5:书写自定义模块,格式xxx.xxx.xxx.......不管是包还是文件夹,用法是一样的。
下面是我们的一些示例代码。
# 3. import xxxx
# 0.
import random,math,string
import aaa.a1
# 语法:模块名,函数/变量
print(aaa.a1.name)
aaa.a1.func1()
# b.import xxx as xxx
import aaa.a1 as f
f.func1()
import numpy as np
import pandas as pd
import matplotlib as plt
1. from xxx import xxx
a. from 模块名 import 函数/变量/类
from random import choice,randint,sample
r1=choice("twetaw")
r2=randint('asdadsasd')
from aaa.a1 import name,func1
# print(name)
# func1()
from aaa.a1 import *
print(name)
func1()