NCBB 发表于 2020-4-2 21:33:38

魔术方法45讲

class Rectangle:
    #初始化赋值,自动触发设置
    def __init__(self,width=0,height=0):
      self.width = width
      self.height = height

    def __setattr__(self,name,value):
      if name == "square":
            self.width = value
            self.height = value
      else:
            #self.name = value 返回到init
            super().__setattr__(name,value)

    def getArea(self):
      return self.width * self.height


else那里有问题:
1、self.name为什么会回到init那里
2、super()那句是什么意思

dlnb526 发表于 2020-4-2 21:43:45

1、self.name为什么会回到init那里

因为self.name=value就相当于重新赋值了,而每次赋值都回到init中,这便是这个类存在的意义~
2、super()那句是什么意思
__setattr__是一个魔法方法,在实现功能之外,还要继承之前__setattr__的其他内容,避免出现错误。

zltzlt 发表于 2020-4-3 13:08:24

1. 不是返回到 init 中,而是返回到 __setattr__ 中,因为设置了实例属性就会自动调用 __setattr__
2. 就是调用父类的 __setattr__(用于设置属性),把一切都交给父类去处理
页: [1]
查看完整版本: 魔术方法45讲