关于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函数,这里调用是什么逻辑呢,该作何理解 在这个例子中,调用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__方法,将宽和高都设置为相同的值。 关于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:}
在这段代码中,调用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__()方法,如果不调用父类的方法,就无法正常处理其他属性的赋值操作。
希望能解答你的疑问!如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案 给个最佳答案呗!求你了!!!{:10_254:} 脚本别给 在你提供的代码中,`__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__`方法得到正确的调用,并实现属性赋值的功能。 isdkz 发表于 2023-8-8 20:27
在这个例子中,调用super函数的目的是将属性赋值的逻辑委托给父类的__setattr__方法来处理。在子类的__seta ...
那把super().__setattr__变成pass不也一样吗 davidmou 发表于 2023-8-9 10:08
那把super().__setattr__变成pass不也一样吗
不一样,变成pass就没法给它设置它的宽高了
页:
[1]