|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
问题如图所示
程序内部执行顺序的问题
问题参考视频教程:045魔法方法:属性访问.mp4
在这里,程序要设置 self.a 和 self.b 的值之后才会打印赋值相同值这一个字符串,
但是, self.a 和 self.b 的设置会先打印两次基类赋值,
因此,基类赋值会在赋值相同值之前。
你可以试试把赋值相同值提到紧跟在 if 的位置,赋值相同值也就会在基类赋值之前了。
- class C:
- def __init__(self,q=0,w=0):
- self.a=q
- self.b=w
- def __setattr__(self,name,value):
- if name == "pp":
- self.a=5
- self.b=5
- print("赋值相同值")
- else:
- print("基类赋值")
- super().__setattr__(name,value)
- test=C()
- test.pp=9
复制代码
跳过test=C()这一行的运行
运行位置 | 运行代码 | 变量更改 | 注释 | 16 | test.pp=9 | | 这时候开始调用__setattr__,这行代码等同于- test.__setattr__("pp", 9)
复制代码 | 16>6 | def __setattr__(self, name, value): | name = "pp"
value = 9 | | 16>7 | if name == "pp": | | 这时候 name 就是 "pp" | 16>8 | self.a = 5 | | 这时候会再次调用__setattr__,也就是 | 16>8>6 | def __setattr__(self, name, value): | name = "a"
value = 5 | | 16>8>7 | if name == "pp": | | 这时候 name 是 "a" | 16>8>12 | print("基类赋值") | | 先打印一次基类赋值 | 16>8>13 | super().__setattr__(name, value) | self.a = 5 | 这时候才成功给 a 赋值 | 16>9 | self.a = 5 | | 这时候会再次调用__setattr__,也就是 | 16>9>6 | def __setattr__(self, name, value): | name = "b"
value = 5 | | 16>9>7 | if name == "pp": | | 这时候 name 是 "b" | 16>9>12 | print("基类赋值") | | 又打印一次基类赋值 | 16>9>13 | super().__setattr__(name, value) | self.b = 5 | 这时候才成功给 b 赋值 | 16>10 | print("赋值相同值") | | 这时候才是赋值相同值 |
|
|