MagicforestA 2022-07-19 16:57 采纳率: 100%
浏览 41
已结题

python class decorator

提问在注释里

def object_counter(class_):
    class_.__getattr__orig = class_.__getattribute__#class_.__getattribute__是一个method, 这里是赋值给变量的意思?

    def new_getattr(self, name):
        if name == 'mileage':
            print('We noticed that the mileage attribute was read')
        return class_.__getattr__orig(self, name)#能否解释一下这个return的意义
    
    class_.__getattribute__ = new_getattr#这里也看不懂
    
    return class_#这里的class_到底算变量,还是类
@object_counter
class Car:
    def __init__(self, VIN):
        self.mileage = 0
        self.VIN = VIN

car = Car('ABC123')
print('The mileage is', car.mileage)
print('The VIN is', car.VIN)

  • 写回答

4条回答 默认 最新

  • CSDN专家-showbo 2022-07-19 21:35
    关注
    def object_counter(class_):
        class_.__getattr__orig = class_.__getattribute__#这个动态给参数class_添加新的方法__getattr__orig,指向class_对象元素的__getattribute__获取属性的方法
     
        def new_getattr(self, name):
            if name == 'mileage':#这里做属性拦截,访问某个属性时,name变量存储要访问的属性名,如果访问属性名mileage,则打印下面的信息
                print('We noticed that the mileage attribute was read')
            if name=="xxx":#这属性没有定义,可以直接返回一个新值,不能调用下面的代码,会出错
                return "xxx"
            return class_.__getattr__orig(self, name)#这里调用原始的对象__getattribute__方法获取属性值后作为函数返回值
        
        class_.__getattribute__ = new_getattr#重新定义对象的__getattribute__指向新的方法new_getattr    
        
        print(type(class_))
        return class_#这里的class_为动态新增了__getattr__orig方法的Car类
    @object_counter
    class Car:
        def __init__(self, VIN):
            self.mileage = 0
            self.VIN = VIN
    
    car = Car('ABC123')
    print('The mileage is', car.mileage)
    print('The VIN is', car.VIN)
    
    print('The VIN is', car.xxx)#未定义的属性
    
     
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 7月27日
  • 已采纳回答 7月19日
  • 创建了问题 7月19日

悬赏问题

  • ¥15 adb push异常 adb: error: 1409-byte write failed: Invalid argument
  • ¥15 android报错 brut.common.BrutException: could not exec (exit code = 1)
  • ¥15 nginx反向代理获取ip,java获取真实ip
  • ¥15 eda:门禁系统设计
  • ¥50 如何使用js去调用vscode-js-debugger的方法去调试网页
  • ¥15 376.1电表主站通信协议下发指令全被否认问题
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥15 复杂网络,变滞后传递熵,FDA
  • ¥20 csv格式数据集预处理及模型选择
  • ¥15 部分网页页面无法显示!