zoukankan      html  css  js  c++  java
  • 面向对象三大特性之继承

    1:继承,顾名思义就是子代继承父辈的一些东西,在程序中也就是子类继承父类的属性和方法。

     1 #Author : Kelvin
     2 #Date : 2019/1/16 18:57
     3 
     4 class Father:
     5     money=1000
     6 
     7     def __init__(self,name):
     8         print("父类的init方法...")
     9         self.name=name
    10 
    11     def teach(self):
    12         print("%s 正在教儿子学习..."%self.name)
    13 
    14 class Son(Father):
    15     pass
    16 
    17 
    18 s=Son("kelvin")
    19 print(s)
    20 #>>>: 父类的init方法...
    21 #>>>: <__main__.Son object at 0x0000018B1A1AEEB8>
    22 s.teach()
    23 # >>>: kelvin 正在教儿子学习...

    可见,即使Son类没有定义init方法,money属性和teach方法,但是由于Son类继承了Father类,所以在实例化Son时可以使用父类的属性值和方法。

    误区:如果子类存在与父类同名的属性和方法,并不是覆盖了从父类继承的属性。因为子类会先从本类开始找对应方法,如果没有再去父类调用。

     

    归一化设计(接口继承):

      使用继承的最大作用就是定义一种规范。让继承者按照规范进行书写代码。

      第一种:普通类继承。缺点:不能限制子类根据父类的规范定义函数。

     1 #Author : Kelvin
     2 #Date : 2019/1/16 19:53
     3 
     4 class Basic():
     5 
     6     def eat(self):
     7         pass
     8     
     9     def drink(self):
    10         pass
    11 
    12 class People(Basic):
    13     def __init__(self,name):
    14         self.name=name
    15     def eat(self):
    16         print("%s吃饭"%self.name)
    17     def drink(self):
    18         print("%s喝水"%self.name)
    19 
    20 class Cat(Basic):
    21     def __init__(self,name):
    22         self.name=name
    23     def eat(self):
    24         print("%s吃饭"%self.name)
    25 
    26 c=Cat("猫咪")
    27 c.eat()
    28 c.drink()

    很明显,代码可以执行,说明子类即使不按照父类定义的标准执行,也不会报错。很明显父类不能起到规定的作用。接下来可以使用这种实现:

     1 #Author : Kelvin
     2 #Date : 2019/1/16 19:53
     3 import abc
     4 class Basic(metaclass=abc.ABCMeta):
     5     @abc.abstractmethod
     6     def eat(self):
     7         pass
     8     @abc.abstractmethod
     9     def drink(self):
    10         pass
    11 
    12 class People(Basic):
    13     def __init__(self,name):
    14         self.name=name
    15     def eat(self):
    16         print("%s吃饭"%self.name)
    17     def drink(self):
    18         print("%s喝水"%self.name)
    19 
    20 class Cat(Basic):
    21     def __init__(self,name):
    22         self.name=name
    23     def eat(self):
    24         print("%s吃饭"%self.name)
    25 
    26 c=Cat("猫咪")
    27 c.eat()
    28 c.drink()

    此时,由于Cat类继承了Basic,但是由于Basic类做了限制,继承Basic类必须实现所有Basic中的方法,但是Cat中只实现了部分方法,因此程序报错。

    如果在子类中定义了和父类同名的属性和成员方法时,如何才能调用父类属性和方法呢?

     1 #Author : Kelvin
     2 #Date : 2019/1/16 20:45
     3 
     4 class way:
     5     def __init__(self,name,speed):
     6         self.name=name
     7         self.speed=speed
     8     def run(self):
     9         print("所有交通工具!")
    10 
    11 class subway(way):
    12     def __init__(self,name,speed,line):
    13         # way.__init__(self,name,speed)
    14         # super(subway, self).__init__()
    15         super().__init__(name,speed)
    16         self.line=line
    17     def run(self):
    18         # way.run(self)
    19         # super(subway, self).run()
    20         super().run()
    21         print("地铁交通工具!")
    22 
    23 s=subway("徐州地铁","10km/min","13号线路")
    24 s.run()

    注释的两种方式可以实现相同效果!

  • 相关阅读:
    Vue的配置安装与项目创建
    log4j:WARN No appenders could be found for logger
    终于在博客园扎根了
    简单工厂模式
    详解apache防盗链网站图片防盗链方法
    怎样能写好文章标题
    生活需要阿Q精神
    2013个人博客全新起航
    华中师范大学新生网上怎么选宿舍
    华中师范大学2012级新生QQ交流群欢迎加入!
  • 原文地址:https://www.cnblogs.com/sun-10387834/p/10279340.html
Copyright © 2011-2022 走看看