TimeWrangler 2023-12-24 22:17 采纳率: 100%
浏览 2
已结题

装饰器的问题:为什么调用不加括号,还只能用静态方法?

装饰器的问题:为什么调用不加括号,还只能用静态方法?


def login(func):
    def inner():
        name=input("用户名:")
        pw=input("密码:")
        if name=="Skyyy"and pw=="sb":
            func()
        else:
            print("gun!!!")
    return inner()

class Person:
    @login
    @staticmethod
    def f2():
        print("\(@^0^@)/")

Person.f2
print("*"*10)
Person.f2()

运行结果:

D:\Skyyy\venv\Scripts\python.exe D:/Skyyy/Warmup/Let's_start.py
用户名:Skyyy
密码:sb
\(@^0^@)/
**********
Traceback (most recent call last):
  File "D:\Skyyy\Warmup\Let's_start.py", line 2119, in <module>
    Person.f2()
TypeError: 'NoneType' object is not callable

进程已结束,退出代码1

  • 写回答

3条回答 默认 最新

  • micthis 2023-12-24 22:49
    关注

    login应该返回inner而不是返回调用inner后的结果。

    def login(func):
        def inner():
            name=input("用户名:")
            pw=input("密码:")
            if name=="Skyyy"and pw=="sb":
                func()
            else:
                print("gun!!!")
        return inner
        #return inner()
    class Person:
        @login
        @staticmethod
        def f2():
            print("\(@^0^@)/")
    #Person.f2
    print("*"*10)
    Person.f2()
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月1日
  • 已采纳回答 12月24日
  • 创建了问题 12月24日

悬赏问题

  • ¥15 grbl为何无法移动到比复位坐标更小的坐标?
  • ¥60 怎样隐藏win7系统进程?
  • ¥15 CBF预处理数据归一化的时候报错了如下图
  • ¥15 qt 转 msvc 后 Opencv 始终打不开视频!
  • ¥15 yolo v5中labelimg的作用
  • ¥15 国赛c题2021,没有理解这一串代码的意思,这样报错该怎么解决(语言-matlab)
  • ¥15 一、执行完中断程序后如何继续运行,二、中断结束后如何跳过中断触发前的点位(LOW点不要继续运行,可以运行UP点)(关键词-程序运行)
  • ¥15 if为什么跳过if 直接执行else 中文
  • ¥200 解决登录微信老版本限制封号问题
  • ¥15 mysql中时间处理问题