zoukankan      html  css  js  c++  java
  • python学习Day18--继承

    【知识点】

    面向对象的三大特性:继承、多态、封装

    【继承】

    (1)继承:class Person(Animal): ——括号里的:父类,基类,超类   括号外的:子类,派生类

     1 class Animal:
     2     def __init__(self,name,sex,age):
     3         self.name=name
     4         self.sex=sex
     5         self.age=age
     6 
     7 class Person(Animal):
     8     pass
     9 
    10 p1=Person('小明','',20)
    11 print(p1.__dict__)    # {'name': '小明', 'sex': '男', 'age': 20}

    (2)初识继承:子类以及子类实例化的对象  可以访问父类的任何方法或变量

      #1、类名可以访问父类的所有东西

     1 class Animal:
     2     breath='呼吸'
     3 
     4     def __init__(self,name,sex,age):
     5         self.name=name
     6         self.sex=sex
     7         self.age=age
     8 
     9     def eat(self):
    10         print("动物都需要吃东西...")
    11 
    12 class Person(Animal):
    13     pass
    14 
    15 print(Person.breath)   # 呼吸    (用类名进行访问)
    16 Person.eat(111)        # 动物都需要吃东西...   (类名访问方法)

      #2、子类实例化的对象也可以访问父类所有东西

    1 p1=Person('小明','',20)
    2 print(p1.breath)    # 呼吸      (用子类实例化对象访问父类静态变量)
    3 p1.eat()            # 动物都需要吃东西... (用子类实例化对象访问父类方法)

       #3、查询顺序

    (3)继承关系中执行方法

      #1、只执行父类的方法:子类中不要定义与父类用名的方法

      #2、只执行子类的方法,在子类中创建这个方法

      #3、既要执行父类中的方法也要执行子类中的方法?

        两种解决方法:

        ① 在自己的类中调用父类的__init__方法(Animal.__init__(self,name,sex,age)。

        并且,在自己的类中定义def __init__(self,name,sex,age,wing)  在下面添加self.wing=wing

     1 # 既要执行父类中的方法也要执行子类中的方法?
     2 # 解决方法1:
     3 class Animal:
     4 
     5     def __init__(self,name,sex,age):
     6         self.name=name
     7         self.sex=sex
     8         self.age=age
     9 
    10     def eat(self):
    11         print("%s吃东西" % (self.name))
    12 
    13 
    14 class Bird(Animal):
    15 
    16     def __init__(self,name,sex,age,wing):
    17         # 类名调用方法需要全部参数,若是对象,不需要self
    18         Animal.__init__(self,name,sex,age)   #调用父类的__init__方法
    19         self.wing=wing
    20 
    21     def bark(self):
    22         print("唧唧叫")
    23 
    24 b=Bird('鹦鹉','',20,'绿翅膀')
    25 print(b.__dict__)   # {'name': '鹦鹉', 'sex': '公', 'age': 20, 'wing': '绿翅膀'}

        ②super(本类,self).__init__(name,sex,age)  #可以简写:super().__init__(name,sex,age)

     1 # 解决方法2:
     2 class Animal:
     3 
     4     def __init__(self,name,sex,age):
     5         self.name=name
     6         self.sex=sex
     7         self.age=age
     8 
     9     def eat(self):
    10         print("%s吃东西" % (self.name))
    11 
    12 
    13 class Bird(Animal):
    14 
    15     def __init__(self,name,sex,age,wing):
    16         # 类名调用方法需要全部参数,若是对象,不需要self
    17         #Animal.__init__(self,name,sex,age)   #调用父类的__init__方法
    18         super().__init__(name,age,wing)   #简写  原本:super(Bird,self).__init__(name,sex,age)
    19         self.wing=wing
    20 
    21     def bark(self):
    22         print("唧唧叫")
    23 
    24 b=Bird('鹦鹉','',20,'绿翅膀')
    25 print(b.__dict__)   # {'name': '鹦鹉', 'sex': '公', 'age': 20, 'wing': '绿翅膀'}

    (4)继承的进阶

      继承:单继承、多继承

      类:经典类,新式类

      #1、新式类:凡是继承object类都是新式类

        python3x 所有的类都是新式类。 因为python3x中的类都默认继承object

      #2、经典类:不继承object类都是经典类

        python2x 所有的类默认都不继承object类,所有的类默认都是经典类

        ★在python2x中出现如下情况为新式类:

    1 class A(object):
    2     pass

        因此,python2x中既有经典类也有新式类

       #3、单继承:新式类、经典类查询顺序一样(依次往上)

       #4、多继承:

         新式类:遵循广度优先

         经典类:遵循深度优先

        ①多继承新式类:class F(D,E):   查询类的继承顺序方法:print(类名.mro())

        一条路走到倒数第二级,然后判断,如果其他路能走到终点,则返回走另一条路,否则走到终点。(每个节点只走一次)

        ②多继承经典类:(一条路走到底)

      #5、继承的优点:

        节省代码,优化代码

        提高代码的复用性,提高代码的维护性,让类与类之间发生关系

    【一道面试题】

    1 class A:
    2     name = []
    3 
    4 p1 = A()
    5 p2 = A()
    6 p1.name.append(1)
    7 # p1.name,p2.name,A.name 分别是什么?

    分析:一般说对象调用类中的静态变量是不能修改的。常规思路肯定认为这里会报错,但是这有个坑,静态变量是可变的数据类型。思路如下:

    在名称空间里,A.name获取的是列表的内存地址(房间号),而往其中放入一个数,那是没有问题的。因此有如下结果

     1 class A:
     2     name = []
     3 
     4 p1 = A()
     5 p2 = A()
     6 p1.name.append(1)
     7 # p1.name,p2.name,A.name 分别是什么?
     8 print(p1.name)  #[1]
     9 print(p2.name)  #[1]
    10 print(A.name)   #[1]

    时间:2020-02-12     16:12:50

  • 相关阅读:
    如何安装unidac 6.2.8 到delphi 7
    Sqoop
    Spark-PySpark sql各种内置函数
    Spark译文(三)
    Spark译文(二)
    Spark译文(一)
    YARN详解
    Spark2.X管理与开发
    Hadoop2.X管理与开发
    离线综合案例
  • 原文地址:https://www.cnblogs.com/fengxb1213/p/12299349.html
Copyright © 2011-2022 走看看