davidmou 发表于 2023-8-8 20:27:31

关于super的一些问题

#要求:写一个矩形类,默认有长和宽两个属性,如果为一个叫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函数,这里调用是什么逻辑呢,该作何理解

isdkz 发表于 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__方法,将宽和高都设置为相同的值。

学习编程中的Ben 发表于 2023-8-8 20:27:52

关于super的使用

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

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

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

为了避免陷入无限递归的问题,我们不能直接在 __setattr__ 方法中调用 self.width = value 或 self.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


希望能够解答你的问题!如果还有其他疑问,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}

陶远航 发表于 2023-8-8 20:27:54

在这段代码中,调用super()函数的作用是调用父类的__setattr__()方法。让我们逐步解释这段代码的作用和调用super()函数的逻辑。

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

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

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

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

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

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

希望能解答你的疑问!如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案

学习编程中的Ben 发表于 2023-8-8 20:31:25

给个最佳答案呗!求你了!!!{:10_254:}

sfqxx 发表于 2023-8-8 20:35:24

脚本别给

Mike_python小 发表于 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__`方法得到正确的调用,并实现属性赋值的功能。

davidmou 发表于 2023-8-9 10:08:31

isdkz 发表于 2023-8-8 20:27
在这个例子中,调用super函数的目的是将属性赋值的逻辑委托给父类的__setattr__方法来处理。在子类的__seta ...

那把super().__setattr__变成pass不也一样吗

isdkz 发表于 2023-8-9 10:13:04

davidmou 发表于 2023-8-9 10:08
那把super().__setattr__变成pass不也一样吗

不一样,变成pass就没法给它设置它的宽高了
页: [1]
查看完整版本: 关于super的一些问题