鱼C论坛

 找回密码
 立即注册
查看: 2273|回复: 3

[已解决]关于装饰器的问题继续求助

[复制链接]
发表于 2020-2-15 15:46:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1、在一个类里面定义装饰器,如果是def decoratore(self, func),会报错TypeError: decoratore() missing 1 required positional argument: 'func',改成def decoratore(func)就能运行了,但是类里面的函数不是一般都是要先加self的么,不知道这样写有没有啥问题
2、在
  1.     def decoratore(func):
  2.         @wraps(func)
  3.         def log(self, *args, **kwargs):
  4.             try:
  5.                 t0 = time.time()
  6.                 t = func(self, *args, **kwargs)
复制代码

这句的时候,pycharm有个提示'App' object is not callable
3、假设有另外一个类里面的函数也要用这个装饰器,该怎么办呢?这个装饰器函数里我写了self.scr.insert,所以放在了类里面,如果放在外面怎么样去scr.insert呢?


代码如下:

  1. import time
  2. import os
  3. import logging
  4. import sys
  5. from functools import wraps
  6. import traceback
  7. import tkinter as tk
  8. from tkinter import INSERT, BOTH, Button


  9. class App:
  10.     def __init__(self, data):
  11.         self.data = data
  12.         self.window = tk.Tk()
  13.         self.scr = tk.Text(self.window, bg='lightgreen')
  14.         self.scr.pack(fill=BOTH, expand=True)
  15.         self.b1 = Button(self.scr, text='funca', cursor='heart', command=self.funca)
  16.         self.b2 = Button(self.scr, text='funcb', cursor='heart', command=self.funcb)
  17.         self.scr.window_create(INSERT, window=self.b1)
  18.         self.scr.window_create(INSERT, window=self.b2)

  19.     def get_logger(self):
  20.         log_dir1 = "logs"
  21.         today = time.strftime('%Y%m%d', time.localtime(time.time()))
  22.         full_path = os.path.join(log_dir1, today)
  23.         if not os.path.exists(full_path):
  24.             os.makedirs(full_path)
  25.         log_path = os.path.join(full_path, "log.log")
  26.         logger = logging.getLogger("log")
  27.         if not logger.handlers:
  28.             formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s')
  29.             file_handler = logging.FileHandler(log_path, encoding="utf8")
  30.             file_handler.setFormatter(formatter)
  31.             console_handler = logging.StreamHandler(sys.stdout)
  32.             console_handler.formatter = formatter
  33.             logger.addHandler(file_handler)
  34.             logger.addHandler(console_handler)
  35.             logger.setLevel(logging.INFO)
  36.         return logger

  37.     # 这里定义装饰器的时候如果加上self会报错
  38.     '''def funca(self):
  39.     TypeError: decoratore() missing 1 required positional argument: 'func'
  40.     '''
  41.     def decoratore(func):
  42.         @wraps(func)
  43.         def log(self, *args, **kwargs):
  44.             try:
  45.                 t0 = time.time()
  46.                 t = func(self, *args, **kwargs)  # 这句pycharm提示“'App' object is not callable”
  47.                 self.get_logger().info(t)
  48.                 t1 = time.time()
  49.                 func_time = t1 - t0
  50.                 self.get_logger().info(f'{func.__name__} 操作执行完成,用时:{func_time}')
  51.                 self.scr.insert(INSERT, f'\n{func.__name__} 操作执行完成,用时:{func_time}\n')
  52.                 return t
  53.             except Exception:
  54.                 self.get_logger().error(f"{func.__name__} 操作出错!以下是错误信息:\n{traceback.format_exc()}")
  55.         return log

  56.     @decoratore
  57.     def funca(self):
  58.         time.sleep(1)
  59.         a = self.data + self.data
  60.         self.scr.insert(INSERT, f'\nfunca用时1秒算出了{self.data}的两倍是:{a}\n')

  61.     @decoratore
  62.     def funcb(self):
  63.         self.scr.insert(INSERT, '\nThis is funcb\n')


  64. a = App(4)
  65. a.window.mainloop()
复制代码
最佳答案
2020-2-18 23:09:14
https://fishc.com.cn/thread-153981-1-1.html   可以看下python Cookbook
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-17 17:42:04 | 显示全部楼层
1、在一个类里面定义装饰器,如果是def decoratore(self, func),会报错TypeError: decoratore() missing 1 required positional argument: 'func',改成def decoratore(func)就能运行了,但是类里面的函数不是一般都是要先加self的么,不知道这样写有没有啥问题

这里的意思是你应该传入一个函数作为参数~类中默认传入self,emmm你把self删了就相当于把self作为func了



                               
登录/注册后可看大图

这问题太长啦吧~~分开发还可以混经验的咧

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-18 23:09:14 | 显示全部楼层    本楼为最佳答案   
https://fishc.com.cn/thread-153981-1-1.html   可以看下python Cookbook
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-19 21:24:28 | 显示全部楼层
Stubborn 发表于 2020-2-18 23:09
https://fishc.com.cn/thread-153981-1-1.html   可以看下python Cookbook

感谢 确实找到答案了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-3 03:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表