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()`函数。