zoukankan      html  css  js  c++  java
  • 继承

    #继承:
    #面向对象的三大特性:继承、封装、多态
    #python中类的继承分为:单继承和多继承
    #子类继承了父类的所有属性,子类自定义的属性如果与父类重名不会覆盖父类的属性,会先从子类中找

    #什么时候用继承:
    #当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好
    #当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承

    '''
    #例如:
    class P1:
    pass
    class P2:
    pass
    class Su1(P1 ): #单继承,继承了p1
    pass
    class Su2(P1 ,P2) #多继承,同时继承了p1p1
    pass
    '''
    #实例:
    class Father:
    age = 40
    def __init__(self,name):
    self.name= name
    def f(self):
    print('%s给了儿子钱'%self.name)

    class Son(Father):
    age = 16
    print('son')

    s1 = Son('alex') #son类继承了Father
    print(s1.name)
    s1.f() #可以调用Father下的方法

    #son类和father类有重名属性age,但是son类的属性不会覆盖father类属性,会先从子类中找
    print('这是子类的属性————>',s1.age)
    print('这是父类的属性————>',Father.age)


    #接口继承:
      #接口继承实质上是:“要求做出一个抽象,这个抽象规定了一个兼容接口,使得外部调用者无需了解具体细节,
    可一视同仁的处理实现了特定接口的所有对象。这种在程序设计上称之为归一化。
      #接口继承就是在基类中定义子类要实现的方法名称(使用@abc.abstractmethod来装饰该函数,但它并未无
    实际功能),继承它的子类必须要自定义这个函数功能,若子类没有该函数,则开始实例化就会报错。
      #用途:某些类要实现相同名称但功能不同的函数时,就可以先定义一个父类,再在子类中定义必须要实现的
    功能。这样子类在继承父类时,就可以避免忘记必须要实现的功能函数了,它是用来规范子类的方法。实际上基类不
    用进行实例化操作,因为它完全没有意义。
      # 子类必须实现读写功能

    #实例:
    import abc
    class All_file(metaclass = abc.ABCMeta ):#父类定义了读写功能的接口
    @abc.abstractmethod
    def read(self):
    pass
    @abc.abstractmethod
    def write(self):
    pass

    class Text_1(All_file ): #Txt_1()继承了All_file(),子类必须实现读写功能
    def read(self):
    print('text_1--->read')
    def write(self):
    print('text_1--->write')

    class Text_2(All_file ): #Txt_2()继承了All_file(),子类必须实现读写功能
    def read(self):
    print('text_2--->read')
    def write(self):
    print('text_2--->write')

    s1 = Text_1 () #实例化
    s2 = Text_2()
    s1.read()
    s1.write()
    s2.read()
    s2.write()
    print('------------end----------')

    #继承顺序——mro线性顺序列表
    #实例:
    class A:
    def test(self):
    print('A')
    class B(A):
    def test(self):
    print('B')
    class C(A):
    def test(self):
    print('C')
    class D(B):
    def test(self):
    print('D')
    class E(C):
    def test(self):
    print('E')
    class F(D,E):
    def test(self):
    print('F')

    f1 = F() #实例化
    f1.test() #按照F->D->B->E->C->A顺序继承
    print(F.__mro__) #__mro__调出继承顺序
    print('----------end---------')


    #在子类中如何调用父类的方法
    #如下实例:
    #方法1
    class School:
    def __init__(self,name,addr):
    self.name = name
    self.addr = addr
    def teacher(self):
    print('这是来自父类的方法',self.name,self.addr)

    class Stu(School):
    def __init__(self,name,addr,sname): #注意点1
    School.__init__(self,name,addr) #注意点2
    self.sname = sname
    def run(self):
    School.teacher(self) #注意点3
    print('%s正在%s的操场跑步'%(self.sname,self.name))
    s1 = Stu('清华','北京','alex')
    s1.run()

    #方法2——super()的使用
    class School:
    def __init__(self,name,addr):
    self.name = name
    self.addr = addr
    def teacher(self):
    print('这是来自父类的方法',self.name,self.addr)

    class Stu(School):
    def __init__(self,name,addr,sname): #注意点1
    super().__init__(name,addr) #注意点2
    self.sname = sname
    def run(self):
    super().teacher() #注意点3
    print('%s正在%s的操场跑步'%(self.sname,self.name))
    s2 = Stu('北京大学','北京','alex')
    s2.run()
  • 相关阅读:
    python3 TypeError: a bytes-like object is required, not 'str'
    Centos 安装Python Scrapy PhantomJS
    Linux alias
    Vim vimrc配置
    Windows下 Python Selenium PhantomJS 抓取网页并截图
    Linux sort
    Linux RSync 搭建
    SSH隧道 访问内网机
    笔记《鸟哥的Linux私房菜》7 Linux档案与目录管理
    Tornado 错误 "Global name 'memoryview' is not defined"
  • 原文地址:https://www.cnblogs.com/shadowfolk/p/14655545.html
Copyright © 2011-2022 走看看