继承这个概念相比很容易明白,在python类中子类有权利使用父类里面的一些资源,那具体子类能使用父类中的哪些资源呢?下面来演示一下。
class Person:
name = 'Tom' # 公有属性
_age = 18 # 受保护属性
__sex = '男' # 私有属性
def __init__(self):
print('init方法')
def func1(self):
print('公有方法')
def _func2(self):
print('受保护方法')
def __func3(self):
print('私有方法')
class Dad(Person): # 继承Person
def test(self):
print(self.name)
print(self._age)
# print(self.__sex) # AttributeError: 'Dad' object has no attribute '_Dad__sex'
self.func1()
self._func2()
# self.__func3() # AttributeError: 'Dad' object has no attribute '_Dad__func3'
self.__init__()
# 除了私有属性和私有方法其他都能访问
# 子类中时能使用父类资源,无法修改
name = 'jerry' # 这里是Dad中新增一个属性,并不是改变Person内的name属性
# 继承关系和资源查找流程见图-----继承关系和资源查找流程.png
# 继承关系和资源查找在python2中遵循MRO原则,但是按照栈原理会违背重写可用原则,所以python3中放弃使用
# 通过print(Dad.mro())可以查看继承顺序
d = Dad()
d.test()
返回结果:
init方法
Tom
18
公有方法
受保护方法
init方法
从上面的结果可以看出来,子类访问父类属性和方法的时候除了私有属性和私有方法其他都能访问。
下面在创建一个Dad类的子类,我们看看mro的结果。
class Sun(Dad):
pass
print(Sun.mro())
返回结果:
[<class '__main__.Sun'>, <class '__main__.Dad'>, <class '__main__.Person'>, <class 'object'>]
下面通过一张图来解释一下。