Python类中定义并调用try装饰器,对类中self参数再理解

装饰器定义

原本想实现的是一个简单的抓取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即可。

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值