python中super用法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

python中super用法
Python中的super()函数用于调用父类(超类)中的方法或属性,它是Python面向对象编程中的一个重要概念。

在本文中,我们将详细介绍super()函数的用法和实例,并且解释为什么使用这个函数。

1. super()函数的基本用法
super()函数的基本语法如下:
```
super([type[, object-or-type]])
```
type表示类的类型,object-or-type表示对象或类。

调用super()函数时,不必指定任何参数。

如果没有参数,则会自动获取当前类和当前实例。

如果有参数,则会返回一个代理对象(proxy object),代理对象会将方法调用转发给父类。

示例代码:
```
class Parent:
def __init__(self):
= "Parent"
def print_name(self):
print()
class Child(Parent):
def __init__(self):
= "Child"
def print_name(self):
super().print_name()
child = Child()
child.print_name()
```
这个程序定义了一个Parent类,它有一个name属性和一个print_name()方法。

然后定义了一个Child类,它从Parent类继承,它也有一个name属性和print_name()方法。

在Child类中,print_name()方法调用了super().print_name(),这样就会调用Parent 类中的print_name()方法。

2. 使用super()函数调用父类构造函数
当我们定义一个子类时,它会默认继承父类的构造函数。

如果我们在子类中重写了构造函数,那么就需要调用父类的构造函数。

这时,我们可以使用super()函数。

示例代码:
```
class Parent:
def __init__(self, name):
= name
def print_name(self):
print()
class Child(Parent):
def __init__(self, name, age):
super().__init__(name)
self.age = age
def print_age(self):
print(self.age)
child = Child("Tom", 10)
child.print_name()
child.print_age()
```
在这个程序中,Parent类有一个带有一个参数name的构造函数,Child类也有一个构造函数,但它带有两个参数name和age。

在Child类的构造函数中,我们使用
super().__init__(name)调用了父类的构造函数,这样就可以在子类中使用父类的属性name了。

3. 使用super()函数调用父类方法
如果在子类中重写了父类的方法,但是在子类方法中我们又需要调用父类的方法,这时也可以使用super()函数。

示例代码:
```
class Parent:
def __init__(self, name):
= name
def print_name(self):
print()
class Child(Parent):
def __init__(self, name, age):
super().__init__(name)
self.age = age
def print_name(self):
super().print_name()
print(self.age)
child = Child("Tom", 10)
child.print_name()
```
在这个程序中,Child类中重写了print_name()方法,但是在子类方法中我们又需要
调用父类的print_name()方法,此时就可以使用super().print_name()来调用父类的方法,将子类中的打印名字和年龄的方法组合起来。

4. super()函数的多重继承
在多重继承中,使用super()函数更加重要。

当一个类有多个父类时,super()函数会按照方法解析顺序(Method Resolution Order,MRO)调用父类方法。

示例代码:
```
class Parent1:
def __init__(self):
1 = "Parent1"
super().__init__()
def print_name1(self):
print(1)
class Parent2:
def __init__(self):
2 = "Parent2"
super().__init__()
def print_name2(self):
print(2)
class Child(Parent1, Parent2):
def __init__(self):
3 = "Child"
super().__init__()
def print_names(self):
super().print_name1()
super().print_name2()
print(3)
child = Child()
child.print_names()
```
在这个程序中,Child类继承了Parent1和Parent2两个父类。

当创建Child对象时,会调用Child类中的构造函数,然后按照MRO顺序依次调用Parent1和Parent2中的构造
函数,并最后调用Object类的构造函数(Object是Python中所有类的基类)。

在Child类的print_names()方法中,我们分别通过super().print_name1()和
super().print_name2()调用了Parent1和Parent2中的print_name()方法,然后再打印Child类中自己定义的name3属性。

5. super()函数的注意事项
在使用super()函数时,需要注意以下几点:
- 在Python 3中,可以直接使用super()函数,不需要指定任何参数。

但是在Python 2中,必须指定一个类型和对象参数,例如super(Child, self)。

- super()函数只能用于调用父类的方法或属性,不能用于调用其他类的方法或属性。

- 在多重继承中,使用super()函数调用父类方法时,可能会出现不符合预期的结果。

这是因为Python使用C3算法确定MRO的顺序,因此需要在继承时小心调整父类的顺序。

- 使用super()函数时,应该尽量遵守继承原则,即子类不应该改变父类的接口。


则可能会引起代码混乱或不易维护的问题。

- 有些情况下,可能需要在子类中完全覆盖父类的方法,这时就不应该使用super()
函数。

- 由于super()函数的执行顺序是在运行时确定的,因此性能可能不如直接调用父类
方法或属性。

在性能关键的地方应该谨慎使用super()函数。

6. 小结
super()函数在Python中的面向对象编程中是非常重要的,它可以调用父类中被子类
方法覆盖的方法和属性。

在实际编程中,我们应该根据自己的具体需要使用super()函数,并注意遵守继承原则和性能优化。

相关文档
最新文档