代码之家  ›  专栏  ›  技术社区  ›  David

为什么在下面的python代码中__getattr__触发__setattr__?

  •  -2
  • David  · 技术社区  · 2 年前
    class D:
        def __init__(self):
            self._attr = 1
            self._attr2 = 2
    
        def __getattr__(self, name):
            if name == 'data':
                return (self._attr, self._attr2)
    
        def __setattr__(self, name, value):
            print('__setattr__')
            if name == 'data':
                self._attr, self._attr2 = value
            else:            
                super().__setattr__(name, value)
    
    d = D()
    print(d.data)  
    #OUTPUT:
    #__setattr__
    #__setattr__
    #(1,2)
    

    出于某种原因 return (self._attr, self._attr2) 表现为的赋值 self._attr self._attr2 ,但为什么?

    我查阅了谷歌(Google)和马克·卢茨(Mark Lutz)的著作《双子星座》(Gemini),但没能搞清楚。

    1 回复  |  直到 2 年前
        1
  •  0
  •   Mark Tolonen    2 年前

    它不是来自 print(d.data) 线评论出来。它来自于在中设置属性 __init__ 。将打印扩展到 __setattr__ print(f'__setattr__({name=}, {value=})') 查看更多信息:

    class D:
        def __init__(self):
            self._attr = 1
            self._attr2 = 2
    
        def __getattr__(self, name):
            if name == 'data':
                return (self._attr, self._attr2)
    
        def __setattr__(self, name, value):
            print(f'__setattr__({name=}, {value=})')
            if name == 'data':
                self._attr, self._attr2 = value
            else:
                super().__setattr__(name, value)
    
    d = D()
    #print(d.data)
    

    输出

    __setattr__(name='_attr', value=1)
    __setattr__(name='_attr2', value=2)
    

    注意,您也可以实现相同的行为 data 作为一个属性,并具有更清晰的代码:

    class D:
        def __init__(self):
            self._attr = 1
            self._attr2 = 2
    
        @property
        def data(self):
            return (self._attr, self._attr2)
    
        @data.setter
        def data(self, value):
            self._attr, self._attr2 = value
    
    d = D()
    print(d.data)
    d.data = 4,5
    print(d.data)
    

    输出

    (1, 2)
    (4, 5)
    
    推荐文章