鱼C论坛

 找回密码
 立即注册
查看: 1758|回复: 6

[已解决]super()的问题

[复制链接]
发表于 2023-4-12 19:04:57 | 显示全部楼层 |阅读模式

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

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

x
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()吗?
请大神解惑,谢谢!
最佳答案
2023-4-12 19:06:00
本帖最后由 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__()方法,并返回属性的值。这种方式可以帮助您访问父类中已经实现的方法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-12 19:05:35 | 显示全部楼层
本帖最后由 sfqxx 于 2023-4-12 19:07 编辑

1. 在第一段代码中,使用`super()`是为了调用父类`str`的构造方法,即创建字符串对象。因为自定义的`capstr`类继承自`str`类,因此需要使用`super()`来调用父类的构造方法。

2. 在第二段代码中,使用`super().__getattribute__(item)`是为了调用父类`object`的`__getattribute__()`方法,以获取对象属性的值。同时使用`print('拿来把你~')`语句可以验证该方法是否被调用。`__getattribute__()`方法在默认情况下是获取对象属性值的方法,相当于`getattr()`函数,但是可以对属性进行更多的控制和处理。
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-12 19:06:00 | 显示全部楼层    本楼为最佳答案   
本帖最后由 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__()方法,并返回属性的值。这种方式可以帮助您访问父类中已经实现的方法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-12 19:14:35 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-12 19:15:40 | 显示全部楼层
甜腻腻的,为什么不选我
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-12 20:58:20 | 显示全部楼层
sfqxx 发表于 2023-4-12 19:15
甜腻腻的,为什么不选我

很抱歉没选大神,主要是我觉得isdkz回复的更加详细一点,并且其中有能让我得到启发的东西,不过还是十分感谢大神指教!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-12 21:01:00 | 显示全部楼层
spflmm 发表于 2023-4-12 20:58
很抱歉没选大神,主要是我觉得isdkz回复的更加详细一点,并且其中有能让我得到启发的东西,不过还是十分 ...

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 19:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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