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日

悬赏问题

  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥20 java在应用程序里获取不到扬声器设备