学习日记03-2_装饰器

文章目录



# 自律 学习日记03-2

一.装饰器

讲装饰器之前我们先来了解一下开放封闭原则(面向对象原则的核心)
开放封闭原则:软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。
装饰器的作用:在不更改原功能函数内部代码,并且不改变调用方法的情况下为原函数添加新的功能,装饰器其实就是闭包应用。

(一)无参装饰器:

username='python'
password='123456'

def login(func):
    def fun():
        user=input('请输入账号:')
        pw=input('请输入密码:')
        if username==user and password==pw:
            func()#哪里需要反回被装饰的内容,这个函数就放在哪里
        else:
            print('登录信息错误')
    return fun

@login
def index():
    print('这是个网站首页')

index()
>>
请输入账号:python
请输入密码:123456
这是个网站首页

(二)无参与带参公用装饰器:

  • 装饰函数不需要return,装饰类要+return
def add(func):
    def fun(*args,**kwargs):
        print('装饰器的功能代码')
        func(*args,**kwargs) #装饰函数不需要return,装饰类要+return
    return fun

@add
def add_num(a,b,c):
    print("相加",a+b+c)

@add
def good_list(num,n):
    print("我是{0},今年{1}".format(num,n))

@add
def index():
    print("测试测试测试")

add_num(11,22,33)
good_list('美女',18)
index()
>>>
装饰器的功能代码
相加 33
装饰器的功能代码
测试测试测试
装饰器的功能代码
第二段10

(三)脱外套:

1.脱衣服:加* 与 不加*的区别:
加*:脱外套
不加*:穿外套

def fun(*args):
    print(args)
fun(1,2,3,4,5)
>>>输出元组:(1,2,3,4,5)

def fun(*args):
    print(*args)
fun(1, 2, 3, 4, 5)
>>>输出:1,2,3,4,5

(四)装饰器:装饰类


def add(func):
    def fun(*args,**kwargs):
        print('装饰器代码')
        #装饰器装饰函数一定要有return,函数如果没有返回值,默认返回none
        return func(*args,**kwargs)  
    return fun

@add
class Myclass():
    def __init__(self):
        pass

    def add(self):
        print('我爱你')

m=Myclass()
print("m的值:",m)
m.add()
>>>装饰器代码
m的值: <__main__.Myclass object at 0x00000000027B8550>
我爱你
def add(func):
    def fun(*args,**kwargs):
        print('装饰器代码')
        return func(*args,**kwargs)
    return fun

@add
class Myclass():
    def __init__(self,name,age):
        self.name=name
        self.age=age

m=Myclass('vivi',18)
print("m的值:",m)
>>>装饰器代码
m的值: <__main__.Myclass object at 0x00....

(五)return func()与return func区别

def func1():
    pass
print(type(func1))
#执行结果:<class 'function'>
print(type(func1()))
#执行结果:<class 'NoneType'>

由此可见:
使用return func 返回的是函数;
使用return func() 返回的是值,如果func()函数没有返回值则返回值为None

(六)一个函数被多个装饰器装饰

import time

with open('ceshi.txt')as f:
    users=eval(f.read())

def login_check(func):
    '''
    登录验证的装饰器
    :param func:
    :return:
    '''
    def ado(*args, **kwargs):
        if not users['token']:
            print('----登录页面-------')
            username=input('账号:')
            password=input('密码:')
            #登录校验
            if users['user']==username and users['pwd']==password:
                users['token']=True #修改token值
                func(*args, **kwargs)
        else:
            func()
    return ado

def wrapper(func):
    def count_time(*args, **kwargs):
        print("开始了2")
        start_time = time.time()
        func(*args, **kwargs)
        end_time = time.time()
        print("{}函数运行的时间为:{:.5f}秒".format(func.__name__, end_time - start_time))
    return count_time

多个装饰器从上往下执行
@wrapper     #func=wrapper(func)
@login_check #func=login_check(func)
def func():
    time.sleep(3)
    print('这是需要被装饰器的函数')

func()

(七)类里面三个内置的装饰器

class MyTest(object):

    def __init__(self):
        passclassmethod装饰了之后,该方法就是一个类方法
	被classmethod装饰了之后,只能类调用MyTest.add(),不能实例调用[t=MyTest,t.add()]
    @classmethod     
    def add(cls):    
        print(cls)
        
	静态方法   实例和类都可以调用
	静态方法可以不传参,要是传参,那么调用的时候也一定要传
    @staticmethod    
    def static():
        print("这个静态方法")
        
	设定只读属性,不可修改
    @property      
    def read_attr(self):
        print("这个装饰器装饰完了之后,该方法可以像属性一样被调用")

    def sub(self):   #self:代表实例本身
        print("---")

t=MyTest()

(八)作业

定义一个计算函数运行时间的装饰器

import time

def wrapper(func):
    def count_time(*args,**kwargs):
        start_time=time.time()
        func(*args,**kwargs)
        end_time=time.time()
        print('函数的运行时间为:{}秒'.format(end_time-start_time))
    return count_time

@wrapper
def test(n):
    time.sleep(n)
    print('运行结束')

test(10)
运行结束了
test函数运行的时间为:10.00000
编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次
后续的函数都无需再输入用户名和密码。{"user":"python01","pwd":"123456","token":False}

with open('ceshi.txt')as f:
    users =eval(f.read())
    
def login_check(func):
    '''
    登录验证的装饰器
    :param func:
    :return:
    '''
    def ado():
        if not users['token']:
            print('----登录页面-------')
            username =input('账号:')
            password =input('密码:')
            # 登录校验
            if users['user']==username and users['pwd' ]==password:
                users['token' ] =True  # 修改token值
                func()
        else:
            func()
    return ado

@login_check
def index():
    print('这是index首页')

@login_check
def page1():
    print('这个是page1页面')

@login_check
def page2():
    print('这个是page2页面')

if __name__=='__main__':
    index()
    page1()
    page2()

>>>>>>>>
----登录页面-------
账号:python01
密码:123456
这个是page1页面
这个是page2页面
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您可以使用 Maven 的系统作用域将 jar 文件导入到项目中,方法如下: 1. 将 jar 文件复制到您的项目的 src/main/resources/lib 目录中。 2. 在项目的 pom.xml 文件中添加以下依赖项: ``` <dependency> <groupId>com.kuaishou.merchant</groupId> <artifactId>kuaishou-merchant-open-sdk-industry</artifactId> <version>1.0.123</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/lib/kuaishou-merchant-open-sdk-release_industry-1.0.123.jar</systemPath> </dependency> ``` 注意:groupId 和 artifactId 的值应该与您的 jar 文件的名称相对应。如果 jar 文件名称与依赖项的 groupId 和 artifactId 不匹配,则需要相应地更改。 3. 运行 Maven 的 install 命令,将 jar 文件添加到本地仓库: ``` mvn install:install-file -Dfile=src/main/resources/lib/kuaishou-merchant-open-sdk-release_industry-1.0.123.jar -DgroupId=com.kuaishou.merchant -DartifactId=kuaishou-merchant-open-sdk-industry -Dversion=1.0.123 -Dpackaging=jar ``` 现在您应该能够在项目中使用 kuaishou-merchant-open-sdk-release_industry-1.0.123.jar 了。 ### 回答2: 在使用Maven导入Spring Boot项目的时候,通常使用的是Maven的依赖管理功能,而不是直接将jar包放入src/main/resources/lib目录下。 首先,我们需要在项目的pom.xml文件中添加对应的依赖信息。可以使用以下方式将kuaishou-merchant-open-sdk-release_industry-1.0.123.jar添加到依赖中: 在<dependencies>标签内添加以下依赖信息: ```xml <dependency> <groupId>com.kuaishou.merchant.open.sdk</groupId> <artifactId>kuaishou-merchant-open-sdk-release_industry</artifactId> <version>1.0.123</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/lib/kuaishou-merchant-open-sdk-release_industry-1.0.123.jar</systemPath> </dependency> ``` 接下来,需要在项目中创建src/main/resources/lib目录,并将kuaishou-merchant-open-sdk-release_industry-1.0.123.jar文件放入该目录下。 然后,使用Maven的命令进行构建和依赖导入: ```bash mvn clean install ``` 通过执行以上命令,Maven会将jar包导入到项目的classpath中,使得项目在运行时可以正常引用该jar包。 最后,可以在项目中引入该jar包的类,使用其提供的功能。 需要注意的是,由于这是一个本地的jar包,在进行项目打包和部署时,需要自行将该jar包放入对应的部署位置,确保运行环境可以正确加载并使用该jar包。 ### 回答3: 要使用Maven导入kuaishou-merchant-open-sdk-release_industry-1.0.123.jar这个jar包,需要进行以下步骤: 1. 确保已经安装了Maven,并且配置了正确的环境变量。 2. 打开项目的pom.xml文件,该文件位于项目的根目录下。 3. 在pom.xml文件中的<dependencies>标签中添加以下代码: ```xml <dependency> <groupId>com.kuaishou.merchant.open.sdk</groupId> <artifactId>kuaishou-merchant-open-sdk-release_industry</artifactId> <version>1.0.123</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/lib/kuaishou-merchant-open-sdk-release_industry-1.0.123.jar</systemPath> </dependency> ``` 4. 在项目的根目录下创建一个名为lib的文件夹,并将kuaishou-merchant-open-sdk-release_industry-1.0.123.jar文件复制到lib文件夹中。 5. 保存pom.xml文件。 6. 在项目的根目录下打开命令行或终端,并执行以下命令: ``` mvn clean install ``` 这将使用Maven将项目重新构建并下载所需的依赖项。此时,Maven会从本地lib目录中加载kuaishou-merchant-open-sdk-release_industry-1.0.123.jar。 通过以上步骤,你就成功地将kuaishou-merchant-open-sdk-release_industry-1.0.123.jar这个jar包导入到了项目中,可以在代码中使用它了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值