装饰器定义
原本想实现的是一个简单的抓取try异常的装饰器
def try_decorator(func):
def wrapper(*args, **kwargs):
try:
return func(*args,**kwargs)
except Exception as e:
print(str(e))
return wrapper
后来在自定义的一个大类中,对不同类函数异常的情况,需要用统一的类方法进行处理,就想把装饰器移到类中
类中实例self的说明
要把上述装饰器转移到类中也比较方便,因为要使用到一些类的属性和方法,只需要再传入self实例即可。在考虑哪个地方添加self的时候出了点问题
已知类定义的每个方法中必须传入self,如果不传入self在定义时不会报错,但在调用时会报错
TypeError: submit() takes 0 positional arguments but 1 was given
如果不想传入self,可以用静态方法调用
@staticmethod
def submit(data):
print(data)
经过一阵排摸之后,发现以上认知还是有问题
在类方法定义和调用时必须传入self实例,除非通过静态方法装饰器定义@staticmethod ?
其实这也有一个大前提,可以通过以下例子说明:
class Test1():
def __init__(self):
print("111")
def outread():
print(__class__)
if __name__ == "__main__":
Test1.outread()
log = Test1()
log.outread()
以上代码的实际输出如下:
直接调用outread()方法正常,在实例化之后,类方法outread()就会报错了,默认实例化后会为每个类方法传入self参数
<class '__main__.Test1'>
111
Traceback (most recent call last):
File "\temp.py", line 36, in <module>
log.outread()
TypeError: outread() takes 0 positional arguments but 1 was given
以上例子说明,如果只是类的定义和直接调用,不会在实例化后调用该方法的话,可以不传入self
如果该方法已经定义了,但实例化后不调用该方法,python解释器不会报错,在pycharm中会有红色下划线提示。
但是类一般情况下都是实例化吧,还是需要带上self的,或者选择静态方法
再回到在类中定义装饰器
类中定义装饰器
例子中,try_decorator定义时,只需要在一的例子中wrapper中再添加self参数,原来一的代码中*args虽然能接收传入的任意的参数,但是没有指定self,wrapper内部调用self相关的实例方法时,由于找不到self这个变量,就会报错。
class Temp():
def __init__(self):
self.setup()
def try_decorator(func):
def wrapper(self,*args, **kwargs):
try:
return func(self,*args,**kwargs)
except Exception as e:
self.d.screenshot(os.path.join(self.latest_path, self.sn + f"{func.__name__} fail" + str(
datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')) + ".png"))
return wrapper
@try_decorator
def get_dev_ip(self):
time.sleep(2)
为什么不在try_decorator定义时传入self?
try_decorator本身并不会被类实例化后调用,只是负责装饰get_dev_ip函数,只需要接收传入的func即可。