|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1、在一个类里面定义装饰器,如果是def decoratore(self, func),会报错TypeError: decoratore() missing 1 required positional argument: 'func',改成def decoratore(func)就能运行了,但是类里面的函数不是一般都是要先加self的么,不知道这样写有没有啥问题
2、在- def decoratore(func):
- @wraps(func)
- def log(self, *args, **kwargs):
- try:
- t0 = time.time()
- t = func(self, *args, **kwargs)
复制代码
这句的时候,pycharm有个提示'App' object is not callable
3、假设有另外一个类里面的函数也要用这个装饰器,该怎么办呢?这个装饰器函数里我写了self.scr.insert,所以放在了类里面,如果放在外面怎么样去scr.insert呢?
代码如下:
- import time
- import os
- import logging
- import sys
- from functools import wraps
- import traceback
- import tkinter as tk
- from tkinter import INSERT, BOTH, Button
- class App:
- def __init__(self, data):
- self.data = data
- self.window = tk.Tk()
- self.scr = tk.Text(self.window, bg='lightgreen')
- self.scr.pack(fill=BOTH, expand=True)
- self.b1 = Button(self.scr, text='funca', cursor='heart', command=self.funca)
- self.b2 = Button(self.scr, text='funcb', cursor='heart', command=self.funcb)
- self.scr.window_create(INSERT, window=self.b1)
- self.scr.window_create(INSERT, window=self.b2)
- def get_logger(self):
- log_dir1 = "logs"
- today = time.strftime('%Y%m%d', time.localtime(time.time()))
- full_path = os.path.join(log_dir1, today)
- if not os.path.exists(full_path):
- os.makedirs(full_path)
- log_path = os.path.join(full_path, "log.log")
- logger = logging.getLogger("log")
- if not logger.handlers:
- formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s')
- file_handler = logging.FileHandler(log_path, encoding="utf8")
- file_handler.setFormatter(formatter)
- console_handler = logging.StreamHandler(sys.stdout)
- console_handler.formatter = formatter
- logger.addHandler(file_handler)
- logger.addHandler(console_handler)
- logger.setLevel(logging.INFO)
- return logger
- # 这里定义装饰器的时候如果加上self会报错
- '''def funca(self):
- TypeError: decoratore() missing 1 required positional argument: 'func'
- '''
- def decoratore(func):
- @wraps(func)
- def log(self, *args, **kwargs):
- try:
- t0 = time.time()
- t = func(self, *args, **kwargs) # 这句pycharm提示“'App' object is not callable”
- self.get_logger().info(t)
- t1 = time.time()
- func_time = t1 - t0
- self.get_logger().info(f'{func.__name__} 操作执行完成,用时:{func_time}')
- self.scr.insert(INSERT, f'\n{func.__name__} 操作执行完成,用时:{func_time}\n')
- return t
- except Exception:
- self.get_logger().error(f"{func.__name__} 操作出错!以下是错误信息:\n{traceback.format_exc()}")
- return log
- @decoratore
- def funca(self):
- time.sleep(1)
- a = self.data + self.data
- self.scr.insert(INSERT, f'\nfunca用时1秒算出了{self.data}的两倍是:{a}\n')
- @decoratore
- def funcb(self):
- self.scr.insert(INSERT, '\nThis is funcb\n')
- a = App(4)
- a.window.mainloop()
复制代码
|
|