携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天,点击查看活动详情
0 环境
- 编辑器:pycharm或者vscode
- 系统版本:windows10
- python版本:3.9.6
1 重写方法
私有的不可以继承,怎么会这样,打印实例.__dict__结果,结果如下图:
私有的名称发生的改变,比如我私有的是__private_ins,现在变成了_Base__private_ins,也就是说私有__private_ins前面添加了_类名。
重写方法,子类不存在父类的公共方法,则用父类的,否则子类覆盖,如下代码: 当我注释掉,子类与父类同名的方法时,调用的父类的方法。
class Base:
def show(self):
print("Base show!!")
class One(Base):
def two(self):
pass
# def show(self):
# print("One show!!!")
if __name__ == '__main__':
one = One()
one.show()
然而当我给子类也加和父类同名的方法,很明显,如下图所示,子类覆盖了父类的方法,打印的One show!!!的结果。
class Base:
def show(self):
print("Base show!!")
class One(Base):
def two(self):
pass
def show(self):
print("One show!!!")
if __name__ == '__main__':
one = One()
one.show()
假如我给这个同名的子类,多加个入参,且父类不变,也就说现在父类和子类的方法同名,但入参不同,会出现什么问题呢,如下图,提示么有name是不是,虽然我本意是,既然入参是空的,应该调用父类的show方法,然而结果不是如此,也就是说,当我子类实例方法和父类同名,但是参数不同,哪怕我想调用父类的方法,也会优先调用子类的方法。
2 总结
继承很方便复用,无需不停的复制粘贴相同方法,这是直观的好处,还有就是当我不想用父类的方法,且不想被其他人有意或无意调用,我只需要同名父类的方法和入参相同,就可以重写该方法,是不是很nice。还有一点,需要注意的是,虽然我想调用父类的方法,但由于和子类的方法同名,不同参数,子类的实例想调用父类的方法,但还是会调用,并会报参数相关的错。