鱼C论坛

 找回密码
 立即注册
查看: 531|回复: 2

[已解决]魔术方法45讲

[复制链接]
发表于 2020-4-2 21:33:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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()那句是什么意思
最佳答案
2020-4-3 13:08:24
1. 不是返回到 init 中,而是返回到 __setattr__ 中,因为设置了实例属性就会自动调用 __setattr__
2. 就是调用父类的 __setattr__(用于设置属性),把一切都交给父类去处理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-2 21:43:45 | 显示全部楼层
1、self.name为什么会回到init那里

因为self.name=value就相当于重新赋值了,而每次赋值都回到init中,这便是这个类存在的意义~
2、super()那句是什么意思
__setattr__是一个魔法方法,在实现功能之外,还要继承之前__setattr__的其他内容,避免出现错误。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-3 13:08:24 | 显示全部楼层    本楼为最佳答案   
1. 不是返回到 init 中,而是返回到 __setattr__ 中,因为设置了实例属性就会自动调用 __setattr__
2. 就是调用父类的 __setattr__(用于设置属性),把一切都交给父类去处理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 21:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表