| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
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()吗? 
请大神解惑,谢谢!
 本帖最后由 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__()方法,并返回属性的值。这种方式可以帮助您访问父类中已经实现的方法。 
 
 
 |   
 
 
 
 |