87_类成员的继承和重写


91.类成员的继承和重写

  1. 成员继承子类继承父类构造方法之外所有成员
  2. 方法重写:子类可以重新定义父类中的方法,这样就会覆盖父类的方法,也称为“重写”

【操作】继承重写的案例

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'>]

继承结构图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jf0ezuLd-1600411538115)(6FAAF50F4ECF473FA444FBC544E60A85)]

重写的两个例子

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值