super()的问题
1. >>> class CapStr(str):... def __new__(cls, string):
... string = string.upper()
... return super().__new__(cls, string)
...
>>> cs = CapStr("FishC")
>>> cs
'FISHC'
2.class C:
def __init__(self, name, age):
self.name = name
self.__age = age
def __getattribute__(self, item):
print('拿来把你~')
return super().__getattribute__(item)
c = C('小甲鱼', 18)
getattr(c, 'name')
拿来把你~
小甲鱼
这两段代码都用了super(),想请教一下,这两处应用super()的意义是什么?为了避免出现死循环吗?
第一段代码的__new__(cls, string)要去父类str找相应的执行方法,父类里的执行方法具体是什么?
第二段代码__getattribute__(item)要去object里去寻找相应的方法,父类里的执行方法具体是什么?是相当于getattr()吗?
请大神解惑,谢谢! 本帖最后由 sfqxx 于 2023-4-12 19:07 编辑
1. 在第一段代码中,使用`super()`是为了调用父类`str`的构造方法,即创建字符串对象。因为自定义的`capstr`类继承自`str`类,因此需要使用`super()`来调用父类的构造方法。
2. 在第二段代码中,使用`super().__getattribute__(item)`是为了调用父类`object`的`__getattribute__()`方法,以获取对象属性的值。同时使用`print('拿来把你~')`语句可以验证该方法是否被调用。`__getattribute__()`方法在默认情况下是获取对象属性值的方法,相当于`getattr()`函数,但是可以对属性进行更多的控制和处理。
有用请设置最佳答案 本帖最后由 isdkz 于 2023-4-12 19:10 编辑
使用super()的目的是在子类中调用父类的方法。它不是为了避免死循环,而是为了避免硬编码父类名称,并允许多继承时正确地查找方法。在您的例子中,您使用super()调用父类的构造函数和属性访问方法。
在第一段代码中,__new__()方法是一个类方法,它用于创建一个新的实例对象,并返回该实例对象。在这里,您在创建CapStr类的新实例时,将字符串转换为大写,并使用super()调用父类str的__new__()方法来创建该实例。
在第二段代码中,__getattribute__()是一个特殊方法,用于在访问对象的属性时自动调用。您在这里使用super()调用父类object的__getattribute__()方法来访问对象的属性。在这种情况下,父类方法返回该属性的值。
总的来说,super()的作用是允许您在子类中调用父类的方法,而不必显式指定父类的名称,从而使代码更具可重用性和可维护性。
当我们编写一个子类时,通常会覆盖父类中的某些方法。但是,在某些情况下,我们可能仍然需要在子类中使用父类中的这些方法。在这种情况下,我们可以使用super()来调用父类中的方法。
在 Python 中,继承是通过创建子类来实现的,该子类继承父类的属性和方法。子类可以覆盖父类中的方法,但是,在某些情况下,子类需要使用父类中已经实现的方法,而不是重写相同的逻辑。这是super()方法的用武之地。
当我们使用super()时,它允许我们在子类中调用父类的方法。使用super()的好处是,我们不必硬编码父类的名称,因此即使我们更改了类层次结构,我们仍然可以正确地调用方法。此外,如果我们在子类中使用多继承,使用super()会更加方便,因为它可以自动帮助我们找到正确的方法。
在您的第一个示例中,CapStr是一个继承自str的子类。您在__new__()方法中使用super()来调用父类str中的__new__()方法,并创建新的字符串实例。在这种情况下,您可以通过覆盖__new__()方法来实现对新实例的修改,而不必使用其他方法来修改实例。
在第二个示例中,__getattribute__()是一个特殊方法,当您访问对象的属性时,它会自动调用。在您的示例中,您使用super()来调用父类object的__getattribute__()方法,并返回属性的值。这种方式可以帮助您访问父类中已经实现的方法。 啊 甜腻腻的,为什么不选我 sfqxx 发表于 2023-4-12 19:15
甜腻腻的,为什么不选我
很抱歉没选大神,主要是我觉得isdkz回复的更加详细一点,并且其中有能让我得到启发的东西,不过还是十分感谢大神指教! spflmm 发表于 2023-4-12 20:58
很抱歉没选大神,主要是我觉得isdkz回复的更加详细一点,并且其中有能让我得到启发的东西,不过还是十分 ...
{:10_269:}
页:
[1]