Mulle880 2022-10-05 18:31 采纳率: 100%
浏览 15
已结题

Python类里的装饰器

Python装饰器
    def is_crawling(self, func):
        def inner(*arg):
            if self.result:
                return func(*arg)
            return '没有数据'

        return inner

    @is_crawling
    def seek_students(self) -> list:
        """
        查看所有的学生
        :rtype: list
        :return: 所有学生的列表
        """
        students = []
        for i in self.result:
            for desk in self.result[i]:
                for value in desk.values():
                    for owner in value:
                        students.append(owner['owner'])
        return students
运行结果及报错内容

TypeError: is_crawling() missing 1 required positional argument: 'func'

我想要达到的结果

我想要在类里写一个装饰器,在调用方法的时候先查看self的一个属性是否为空,不为空就执行,为空就返回“没有数据”,代码应该如何修改

  • 写回答

1条回答 默认 最新

  • 林地宁宁 2022-10-05 21:57
    关注

    把修饰器提到最外层去,然后修饰器的 self 直接从 *args 里面去拿。

    import functools
    
    def is_crawling(func):
        @functools.wraps(func)
        def inner(*arg):
            assert len(arg) >= 1
            self = arg[0]
            if self.result:
                return func(*arg)
            return '没有数据'
        return inner
    
    class Test:
        @is_crawling
        def seek_students(self) -> list:
            """
            查看所有的学生
            :rtype: list
            :return: 所有学生的列表
            """
            students = []
            for i in self.result:
                for desk in self.result[i]:
                    for value in desk.values():
                        for owner in value:
                            students.append(owner['owner'])
            return students
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月15日
  • 已采纳回答 12月7日
  • 创建了问题 10月5日

悬赏问题

  • ¥15 划分vlan后不通了
  • ¥15 GDI处理通道视频时总是带有白色锯齿
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大
  • ¥15 Revit2020下载问题
  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大