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