鱼C论坛

 找回密码
 立即注册
查看: 1668|回复: 8

[已解决]关于super的一些问题

[复制链接]
发表于 2023-8-8 20:27:31 | 显示全部楼层 |阅读模式

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

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

x
#要求:写一个矩形类,默认有长和宽两个属性,如果为一个叫Square个属性赋值,
# 那么说明这是一个正方形,值就是正方形的边长,此时的宽和高都应该等于边长
class rectangle:
    def __init__(self,width = 0, height = 0):
        self.width = width
        self.height = height
    def __setattr__(self,name, value):
        if name == "Square":
            self.height = value
            self.width = value
        else:
            super.__setattr__(name,value)
    def gerara(self):
        return self.height * self.width

问一下为什么这里要调用super函数,这里调用是什么逻辑呢,该作何理解
最佳答案
2023-8-8 20:27:54
在这段代码中,调用super()函数的作用是调用父类的__setattr__()方法。让我们逐步解释这段代码的作用和调用super()函数的逻辑。

首先,这段代码定义了一个矩形类rectangle,具有默认的长(width)和宽(height)两个属性。在初始化方法__init__()中,通过self.width = widthself.height = height来为对象的属性赋值。

接下来,重写了__setattr__()方法。当对象的属性被设置时,__setattr__()方法将被调用。在这个方法中,使用了条件判断语句来判断属性的名称。

如果属性的名称是"Square",即设置了一个叫做"Square"的属性,那么说明这是一个正方形,属性值即为正方形的边长。此时,通过self.height = valueself.width = value将宽和高都设为边长。

如果属性的名称不是"Square",则调用super().__setattr__(name, value)来调用父类的__setattr__()方法,用于正常设置其他属性的值。

最后,在方法gerara()中计算矩形面积,即返回self.height * self.width

在这段代码中,调用super().__setattr__(name, value)的逻辑是为了确保父类的__setattr__()方法仍然被调用,以处理其他非特殊属性的设置。这是因为我们重写了__setattr__()方法,如果不调用父类的方法,就无法正常处理其他属性的赋值操作。

希望能解答你的疑问!如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-8 20:27:46 | 显示全部楼层
在这个例子中,调用super函数的目的是将属性赋值的逻辑委托给父类的__setattr__方法来处理。在子类的__setattr__方法中,我们首先判断属性名是否为"Square",如果是的话,我们将宽和高都设置为相同的值。如果属性名不是"Square",则调用super.__setattr__(name, value)来将属性赋值的逻辑交给父类来处理。

这样做的逻辑是为了避免在子类的__setattr__方法中无限循环地调用自身。如果我们直接在子类的__setattr__方法中使用self.width = value和self.height = value来赋值,那么会再次触发__setattr__方法,导致无限递归调用。

通过调用super.__setattr__(name, value),我们将属性赋值的逻辑委托给父类的__setattr__方法来处理,避免了无限循环调用的问题。这样,当我们在子类中调用self.Square = value时,会触发父类的__setattr__方法,将宽和高都设置为相同的值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-8 20:27:52 | 显示全部楼层
关于super的使用

在这段代码中,super().__setattr__(name, value) 是调用父类(object)的 __setattr__ 方法来设置属性值。让我们解析一下这个逻辑。

首先,__setattr__ 方法是一个特殊方法,用于设置属性值。当你使用 self.attribute = value 这样的赋值语句时,实际上会调用 __setattr__ 方法。

在这个矩形类中,我们重写了 __setattr__ 方法,用于处理特殊情况:如果你给属性名为 "Square" 的属性赋值,那就说明这是一个正方形,并且值就是正方形的边长。此时,我们需要将宽度和高度都设为边长。

为了避免陷入无限递归的问题,我们不能直接在 __setattr__ 方法中调用 self.width = valueself.height = value,因为这会再次触发 __setattr__ 方法,导致无限循环。

所以,我们使用 super().__setattr__(name, value) 来调用父类的 __setattr__ 方法。这样做会绕过当前类的 __setattr__ 方法,直接将属性值设置为传入的值。

通过使用 super(),我们保证了在设置属性值时不会陷入无限递归的问题。

下面是修改后的完整代码:
class Rectangle:    def __init__(self, width=0, height=0):        self.width = width        self.height = height    def __setattr__(self, name, value):        if name == "Square":            self.height = value            self.width = value        else:            super().__setattr__(name, value)    def gerara(self):        return self.height * self.width
希望能够解答你的问题!如果还有其他疑问,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-8 20:27:54 | 显示全部楼层    本楼为最佳答案   
在这段代码中,调用super()函数的作用是调用父类的__setattr__()方法。让我们逐步解释这段代码的作用和调用super()函数的逻辑。

首先,这段代码定义了一个矩形类rectangle,具有默认的长(width)和宽(height)两个属性。在初始化方法__init__()中,通过self.width = widthself.height = height来为对象的属性赋值。

接下来,重写了__setattr__()方法。当对象的属性被设置时,__setattr__()方法将被调用。在这个方法中,使用了条件判断语句来判断属性的名称。

如果属性的名称是"Square",即设置了一个叫做"Square"的属性,那么说明这是一个正方形,属性值即为正方形的边长。此时,通过self.height = valueself.width = value将宽和高都设为边长。

如果属性的名称不是"Square",则调用super().__setattr__(name, value)来调用父类的__setattr__()方法,用于正常设置其他属性的值。

最后,在方法gerara()中计算矩形面积,即返回self.height * self.width

在这段代码中,调用super().__setattr__(name, value)的逻辑是为了确保父类的__setattr__()方法仍然被调用,以处理其他非特殊属性的设置。这是因为我们重写了__setattr__()方法,如果不调用父类的方法,就无法正常处理其他属性的赋值操作。

希望能解答你的疑问!如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-8 20:31:25 | 显示全部楼层
给个最佳答案呗!求你了!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-8 20:35:24 | 显示全部楼层
脚本别给
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-8 20:38:52 | 显示全部楼层
在你提供的代码中,`__setattr__`方法被用来设置属性值。当给属性名为"Square"的属性赋值时,会将该值同时赋给`width`和`height`属性,以创建一个正方形。

在`__setattr__`方法中,你调用了`super().__setattr__(name, value)`来设置属性值。这里的`super()`函数是用于调用父类(基类)的方法,而`__setattr__`方法实际上是定义在python内置的基类`object`中的。通过调用`super().__setattr__(name, value)`,你可以确保基类`object`中的`__setattr__`方法被正确调用,从而实现属性赋值的功能。

需要注意的是,在`super().__setattr__`函数调用中,你需要传入`name`和`value`参数,以便正确地设置属性值。这样做的好处是避免了无限递归调用,因为直接在`__setattr__`方法中调用`self.__setattr__(name, value)`会导致无限循环。

总结来说,调用`super().__setattr__(name, value)`的作用是确保基类`object`中的`__setattr__`方法得到正确的调用,并实现属性赋值的功能。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-9 10:08:31 | 显示全部楼层
isdkz 发表于 2023-8-8 20:27
在这个例子中,调用super函数的目的是将属性赋值的逻辑委托给父类的__setattr__方法来处理。在子类的__seta ...

那把super().__setattr__变成pass不也一样吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-9 10:13:04 | 显示全部楼层
davidmou 发表于 2023-8-9 10:08
那把super().__setattr__变成pass不也一样吗

不一样,变成pass就没法给它设置它的宽高了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 01:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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