Python super()函数:让子类访问父类方法

1. 了解super()函数

在Python中,当子类继承自父类时,它可以继承父类的属性和方法,也可以重写父类的方法。但是,有时候子类想要继承父类的某个方法并且对其进行扩展。在这种情况下,就需要使用`super()`函数。

`super()`是一个内置函数,用于访问父类的属性和方法。它返回一个代理对象,这个代理对象允许你调用父类的方法并且可以接收一组参数。

在Python 3中,可以使用以下语法调用父类方法:

class ChildClass(ParentClass):

def some_method(self, arg1, arg2, ...):

super().父类方法名(arg1, arg2, ...)

在Python 2.x中,需要添加父类名称:

class ChildClass(ParentClass):

def some_method(self, arg1, arg2, ...):

super(ChildClass, self).父类方法名(arg1, arg2, ...)

下面,我们将演示`super()`函数如何使用。

2. 父类和子类

在这个示例中,我们将定义两个类:`Person`和`Employee`。`Employee`是`Person`的子类。`Person`类有一个名为`__init__()`的方法,它接收两个参数:`name`和`age`。Employee类继承了Person类,并且添加了一个名为`__init__()`的新方法,它接收三个参数:`name`,`age`和`salary`。我们使用`super()`函数来调用父类的`__init__()`方法,并将`name`和`age`传递给它。

2.1 定义Person类

我们从定义`Person`类开始。它只有一个`__init__()`方法,这个方法接收两个参数:`name`和`age`。

class Person:

def __init__(self, name, age):

self.name = name

self.age = age

我们使用`self.name`和`self.age`来创建实例变量。这些变量将存储我们传递给构造函数的参数。

2.2 定义Employee类

现在我们定义一个继承自`Person`的子类。这个子类名为`Employee`。与`Person`类类似,`Employee`类也有一个`__init__()`方法。不过,在这里我们添加了一个新的参数`salary`。

class Employee(Person):

def __init__(self, name, age, salary):

super().__init__(name, age)

self.salary = salary

在这个子类中,我们使用`super().__init__(name, age)`来调用父类的构造函数,并把`name`和`age`传递给它。随后,我们把`salary`存储在实例变量`self.salary`中。

2.3 创建实例并调用方法

我们已经定义了`Person`类和`Employee`类,现在我们可以创建实例并调用方法。让我们创建一个名为`John`的`Employee`对象,并将其输出。

john = Employee('John', 30, 5000)

print(john.name)

print(john.age)

print(john.salary)

输出如下:

John

30

5000

在这里我们使用`print()`语句打印了`john.name`,`john.age`和`john.salary`。这些变量都是从`Person`中继承的。当我们调用`Employee`构造函数时,`super().__init__()`自动调用了父类`Person`的构造函数,并且传递了`name`和`age`参数。

2.4 扩展子类的方法

现在我们来看一下如何扩展子类的方法。假设我们想要给`Employee`类添加一个方法来计算员工的税收。我们可以在`Employee`类中添加一个新方法`calculate_tax()`,这个方法使用`salary`计算税收。

class Employee(Person):

def __init__(self, name, age, salary):

super().__init__(name, age)

self.salary = salary

def calculate_tax(self):

tax = self.salary * 0.2

return tax

在上面的代码示例中,我们使用已知的税率0.2来计算税收。

2.5 调用子类的方法

我们可以通过Employee对象调用这个新方法(例如,`john.calculate_tax()`),这将返回John的税收。但是,`calculate_tax()`方法仍然可以使用`Person`类的构造函数。我们可以使用`super()`函数来访问父类方法并扩展它。

在下面的示例中,我们扩展了`calculate_tax()`方法,使它会在计算税收之前,判断当前员工是否已经退休。如果已经退休,返回一个字符串,如果没有,则通过调用父类方法`super().calculate_tax()`来计算税收。

class Employee(Person):

def __init__(self, name, age, salary):

super().__init__(name, age)

self.salary = salary

def calculate_tax(self):

if self.age >= 60:

return '无需缴纳税收'

else:

tax = super().calculate_tax()

return tax

在上面的代码中,我们在`Employee`的`calculate_tax()`方法中添加了一个条件,如果员工的年龄超过或等于60岁,则不需要缴纳税收,返回一个字符串。否则,调用父级的`calculate_tax()`方法,并返回计算出的税收。

下面,我们将创建一个`Employee`对象,并调用`calculate_tax()`方法来检查代码是否正常工作。

john = Employee('John', 35, 5000)

print(john.calculate_tax())

输出结果如下:

1000.0

3. 总结

在这篇文章中,我们介绍了`super()`函数,它可以让你调用父类的属性和方法。我们演示了如何继承一个类,并添加一个新方法,该方法使用`super()`来调用父类的方法并对其进行扩展。我们还演示了如何使用条件语句来扩展子类的方法,并放回结果。

请注意,在Python 2.x中,调用父级方法时需要使用`super(ChildClass, self)`语法。在这种情况下,您需要显式传递子类和实例作为参数。但是,由于Python 3中的`super()`函数会自动获取当前类和实例,因此您可以直接使用`super()`函数。

最后,请注意,`super()`函数只适用于新式类。因此,在编写代码时,最好将所有类定义为新式类,以便您可以使用`super()`函数。

后端开发标签