91.类成员的继承和重写
成员继承
:子类继承
了父类
除构造方法之外
的所有成员
。方法重写
:子类可以重新定义父类中的方法
,这样就会覆盖父类的方法
,也称为“重写”
【操作】继承
和重写
的案例
class Person:
def __init__(self, name, age):
self.name = name
self.__age = age # 私有属性
def say_age(self):
print("我的年龄:", self.__age) # 私有属性 给一个接口 访问 age
def say_introduce(self): # 自我介绍的意思
print("我的名字是{0}".format(self.name))
class Student(Person):
def __init__(self, name, age, score):
Person.__init__(self, name, age) # 必须显式的调用父类初始化方法,不然解释器不会去调用
self.score = score
def say_introduce(self):
print("报告老师,我的名字是:{0}".format(self.name))
s = Student("haizeiwang", 18, 80)
s.say_age()
s.say_introduce()
运行结果:
我的年龄: 18
报告老师,我的名字是:haizeiwang
查看类的继承层次结构
通过类的方法 mro()
或者类的属性__mro__
可以输出这个类的继承层次结构
。
【操作】 查看类的继承层次结构
class A:
pass
class B(A):
pass
class C(B):
pass
print(C.mro())
执行结果:
# 从子孙后代开始排序。一直到 一切对象的 父类 object
[<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
继承结构图
重写的两个例子
tips: 一定不要 和 python 内置的 命名 重复。
更加不要重复了 还 递归 调用。
其实这只是 一个例子罢了。 换汤不换药而已。
class Oar:
def __init__(self,oar):
self.o=oar
def print_(self):
print(self.o) # print 不会到class Oar下面找,除非引用self.print
def decorator(cls):
def print_(self):
print('content: {}'.format(self.o))
return self
cls.print_=print_
return cls
# InheritOar=decorator(InheritOar) 装饰器 @ 符号等同于这一句
@decorator
class InheritOar(Oar):pass
i=InheritOar("uinp")
i.print_
class Person:
def __init__(self,name,id_):
self.name=name
self.id_=id_
def print_(self):
print("name : %s | id : %s"%(self.name,self.id_))
class Student(Person):
pass
def print_(s):
print("this is onepis print %s and %s"%(s.name,s.id_))
def print_(self):
print("this is onepis print %s and %s "%(self.name,self.id_))
Student.print_=print_
s2=Student("Yamateh",2)
s2.print_()
为什么最好 不要和python 关键字 重复命名。
看下面的示例
class Oar:
def __init__(self,oar):
self.o=oar
def print(self):
# 这里
# 如果写 print(self.o) 会导致递归调用根本无法打印。
# 并且你的 self 在 递归的时候 就被 self.o 给替换掉了。
# print 不会到全局下面找,而是 引用self.print
# 所以你的打印就成了死循环
return self.o
def decorator(cls):
def print(self):
return 'content: {}'.format(self.o)
cls.print=print
return cls
# InheritOar=decorator(InheritOar) 装饰器 @ 符号等同于这一句
@decorator
class InheritOar(Oar):pass
i=InheritOar("uinp")
i.print