在 Python 中,方法重写指的是在一个子类中定义与父类中相同名称的方法。在这种情况下,Python 解释器会根据实际引用的对象来决定调用哪个方法。
你可以总是覆盖父类的方法。覆盖父类方法的一个原因是,你可能希望在你的子类中有特殊或不同的功能。
示例
在下面的代码中,我们覆盖了 Parent 类中的一个名为 myMethod 的方法。
class Parent:
def myMethod(self):
print ('调用父类方法')
class Child(Parent):
def myMethod(self):
print ('调用子类方法')
c = Child()
c.myMethod()
当执行上述代码时,它会产生以下输出:
调用子类方法
为了理解 Python 中的方法重写,让我们再看一个例子。我们将使用下面的 Employee 类作为父类:
class Employee:
def __init__(self, nm, sal):
self.name = nm
self.salary = sal
def getName(self):
return self.name
def getSalary(self):
return self.salary
接下来,我们定义一个使用 Employee 作为父类的 SalesOfficer 类。它继承了父类中的实例变量 name 和 salary。另外,子类还有一个额外的实例变量 incentive。
我们将使用内置函数 super() 来返回父类的引用,并在子类构造函数 __init__() 方法中调用父类构造函数。
class SalesOfficer(Employee):
def __init__(self, nm, sal, inc):
super().__init__(nm, sal)
self.incnt = inc
def getSalary(self):
return self.salary + self.incnt
getSalary() 方法被重写以将激励加到工资上。
示例
声明父类和子类的对象,并查看覆盖的效果。完整的代码如下:
class Employee:
def __init__(self, nm, sal):
self.name = nm
self.salary = sal
def getName(self):
return self.name
def getSalary(self):
return self.salary
class SalesOfficer(Employee):
def __init__(self, nm, sal, inc):
super().__init__(nm, sal)
self.incnt = inc
def getSalary(self):
return self.salary + self.incnt
e1 = Employee("Rajesh", 9000)
print ("{} 的总工资是 Rs {}".format(e1.getName(), e1.getSalary()))
s1 = SalesOfficer('Kiran', 10000, 1000)
print ("{} 的总工资是 Rs {}".format(s1.getName(), s1.getSalary()))
当你执行这段代码时,它将产生以下输出:
Rajesh 的总工资是 Rs 9000
Kiran 的总工资是 Rs 11000
可重写的基方法
下表列出了一些 object 类的一般功能,它是所有 Python 类的父类。你可以在自己的类中覆盖这些方法:
| 序号 |
方法 & 描述 & 样例调用 |
| 1 |
__init__ ( self [,args...] ) 构造函数(带有任何可选参数) |
| 2 |
__del__( self ) 析构函数,删除对象 |
| 3 |
__repr__( self ) 可评估字符串表示形式 |
| 4 |
__str__( self ) 可打印字符串表示形式 |