ziputao 发表于 2018-8-7 01:00:13

第45讲关于__setattr__递归的疑惑

class Rect:
        def __init__(self,width=0,hight=0):
                self.width = width
                self.hight = hight
        def __setattr__(self,name,value):
                if name = 'zhengfangxing':
                        self.width = value
                        self.hight = value
                else:
                        super().__setattr__(name,value)

rect = Rect(4,5)
rect.zhengfangxing = 10
print(self.width)
这个代码中标红的部分,当执行到此代码块的时候按理说不同样会进入死循环么?对属性进行赋值,然后再次调用__setattr__ 方法。。。。。。
求指点迷津!

无符号整形 发表于 2018-8-7 08:19:17

只有对类的实例化对象赋值的时候才会调用那个类型的__setattr__(注意,不是那个类型里面的变量)

冬雪雪冬 发表于 2018-8-7 08:26:00

我的理解,第一次,执行zhengfangxing = 100,调用__setattr__,if为True,执行红字部分,而红字部分又调用__setattr__,这时if为False,调用父类的__setattr__,就不再循环调用了。

chongchuigu 发表于 2018-8-7 11:26:21

冬雪雪冬 发表于 2018-8-7 08:26
我的理解,第一次,执行zhengfangxing = 100,调用__setattr__,if为True,执行红字部分,而红字部分又调用 ...

感谢解惑

ziputao 发表于 2018-8-8 01:30:10

冬雪雪冬 发表于 2018-8-7 08:26
我的理解,第一次,执行zhengfangxing = 100,调用__setattr__,if为True,执行红字部分,而红字部分又调用 ...

明白了,感谢!!!

阳顺 发表于 2019-10-31 10:31:48

__init__(self[, ...])构造器,当一个实例被创建的时候调用的初始化方法
__setattr__(self, name, value) 定义当一个属性被设置时的行为
class Rect:
      def __init__(self,width=0,hight=0):
                self.width = width
                self.hight = hight
      def __setattr__(self,name,value):
                if name = 'zhengfangxing':
                        self.width = value
                        self.hight = value
                else:
                        super().__setattr__(name,value)

rect = Rect(4,5)
rect.zhengfangxing = 10
print(self.width)
问题:这个代码中标红的部分,当执行到此代码块的时候按理说不同样会进入死循环么?对属性进行赋值,      然后再次调用__setattr__ 方法

解答:第一次,执行zhengfangxing = 10,调用__setattr__,if为True,执行红字部分,而红字部分又调用__setattr__,这时if为False,调用父类的__setattr__,就不再循环调用了

Vicissitude357 发表于 2022-8-29 21:05:21

感谢感谢
页: [1]
查看完整版本: 第45讲关于__setattr__递归的疑惑