zoukankan      html  css  js  c++  java
  • python中类与对象之继承

    面对对象的三大特性之继承

    1.什么是继承?

       在程序中,继承指的是class与class之间的关系

       继承是一种关系,必须存在两个class才能产生这种关系;被继承的class称为父类,继承的class称为子类。 

    2.为什么要使用继承?

    现实中,通过继承,子可以直接使用父的内容。

    在程序中,通过继承,子类可以直接使用父类已有的代码

    3.如何使用继承

    #继承的定义
    class Father1:
        x = 13
        print('这是父类的x', x)
        def coding(self):
            print('我是父类的对象的绑定方法coding')
        @classmethod
        def missing(cls):
            print('这是父类的绑定方法missing')
    class Father2:
        y = 14
        print('这是父类Father的y', y)
    class Son(Father1, Father2):
        passprint(Son.x)
    print(Son.y)
    son1 = Son()
    Son.coding(son1)
    Son.missing()
    son1.missing()
    ​
    ​
    ###输出结果
            13
            14
            我是父类的对象的绑定方法coding
            这是父类的绑定方法missing    
    #1.命名方式:
              在子类中类名加上括号,加上父类的名称即可
    #2.在python中,一个子类可以有多个父类,多个父类在括号中用逗号隔开,这一点在其他语言中是不支持的。
    #3.子类中的对象可以访问父类的属性和方法。
    #4.子类可以调用父类的绑定方法

    4.抽象

    抽象:就是抽取公共的父类的方法

    抽象的作用:抽取多个类中相同的方法和属性形成一个新的类

    #应用如下:
    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
        def eating(self):
            print('%s要吃饭' % self.name)
        def sleeping(self):
            print('%s要睡觉' % self.name)
    ​
    class Child(Person):
        def crying(self, mom):
            print('%s今年%s岁会哭着找妈妈%s' % (self.name, self.age, mom.name))
    ​
    class Adult(Person):
        def working(self, papa):
            print('%s会找老公%s' % (self.name, papa.name))
    ​
    xiaoming = Child('xiaoming' , 2)
    mom = Adult('jessic', 28)
    papa = Adult('egon', 30)
    xiaoming.crying(mom)
    mom.working(papa)
    xiaoming.eating()
    xiaoming.sleeping()
    ​
    ###输出结果
    xiaoming今年2岁会哭着找妈妈jessic
    jessic会找老公egon
    xiaoming要吃饭
    xiaoming要睡觉
    ​
    #总结:
    1.通过继承,避免了重复代码的书写
    2.通过抽象,避免了继承一些不该有的方法和属性
    3.写继承时应该先抽象再继承
    4.在抽取过程中,可能会有一些跟业务需求无关的类这是正常的,这些称为公共父类。
    5.公共父类的作用是储存多个子类相同的属性和方法

    5.派生

    派生指的是子类继承父类,并且拥有自己独特的属性或技能,该子类称为派生。派生类一定是子类。

    #为什么有派生类?
    #因为子类可能有自己独特的属性需要添加
    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
        def say_hi(self):
            print("hello my name is %s,i'm %s years old" % (self.name, self.age))
    ​
    class Student(Person):
        def __init__(self, name, age, adress):
            self.name = name
            self.age = age
            self.adress = adress
        def attend_class(self):
            print('%s家在%s,%s岁,要好好学习' % (self.name, self.adress, self.age))
    ​
    daidai = Student('daidai', 26, 'china')
    daidai.say_hi()
    daidai.attend_class()
    hello my name is daidai,i'm 26 years old
    daidai家在china,26岁,要好好学习
    ​
    #Student就是一个派生类

    6.子类访问父类的方法和属性

    在派生中,相同的初始化属性,相同部分写了重复代码

    有两种方式可以让子类访问父类的方法和属性

    class Student(Person):
        def __init__(self, name, age, adress):
            #第一种调用方式:在子类中重用父类方法。这种调用方式与继承关系无关
            Person.__init__(self, name, age)
            self.adress = adress
            
        def attend_class(self):
            print('%s家在%s,%s岁,要好好学习' % (self.name, self.adress, self.age))
    ​
    daidai = Student('daidai', 26, 'china')
    daidai.say_hi()
    daidai.attend_class()
    ​
    ###2.
    class Student(Person):
        def __init__(self, name, age, adress):
            #第二种调用方式:利用super()
            #super()表示创建一个特殊对象,可用于调用父类
            super().__init__(name,age)
            # Person.__init__(self, name, age)
            self.adress = adress
        def attend_class(self):
            print('%s家在%s,%s岁,要好好学习' % (self.name, self.adress, self.age))
    ​
    daidai = Student('daidai', 26, 'china')
    daidai.say_hi()
    daidai.attend_class()
    ​
    ##了解
    在python2中,super()的使用方法有所不同,需要写成:
    super(Student, self).__init__(name, age)
    #其中Student表示父类,self表示是对象本身

    7.继承后子类的属性查找

    class S:
        x = 1class A(S):
        x = 2class B(A):
        x = 3
    ​
    b = B()
    b.x = 4
    print(b.x)
    ​
    子类对象和对象的查找方法的查找顺序:
    对象——>B(子类)——>A(父类)——>S(父类)
    ​
    #如果一个子类有多个父类时查找顺序
    #1.如果父类不存在自己的父类时,按照继承的顺序去查找BASC
    #2.如果父类还有自己的父类时,则按照继承顺序沿一条线找到底(深度查找)
    #3.如果存在两层关系还有公共关系时,会按照广度优先原则查找,也就是最后一层不会先找,先按照深度原则找完父类,然后再找父类的公共类
    class C:
        x = 5
    class S:
        x = 1class A:
        x = 2class B(A, S, C):
        x = 3
    ​
    b = B()
    b.x = 4
    print(b.x)
    ​
    ​
    #注意:
    1.在经典类中,属性的查找只按照深度查找原则
    2.只有在python2中才有经典类

    8.经典类和新式类

    所有直接继承或者间接继承object的类,都是新式类,object称之为根类,意思时所有类都是源自object类

    • 为什么这么设计?

      创建对象时,需要申请内存空间,创建新的名称空间,将对象的属性放入名称空间,这一复杂的基础操作都是由object完成的。简单来说就是object提供了一些常用的基础操作

    注意:

    1.在python3中,所有类都是object的子类,所有类都是新式类

    2.在python2中,默认的是经典类,不会继承object

    #区别
    #python3中定义类
    class Cls():
        print('python3中定义类')
        
    #python2中
    class Cls(Object):
        print('python2中定义类')
    • ——base——的作用

      class Cls():
          print('python3中定义类')
      Cls.__base__#Cls.__base__用于查看父类
      ​
      ​
      Cls.mor()
      .mor()显示属性列表
  • 相关阅读:
    hdu 4114 Disney's FastPass 状压dp
    lightoj 1381
    bzoj 2428: [HAOI2006]均分数据 随机化
    bzoj 3969: [WF2013]Low Power 二分
    套题:wf2013 (1/8)
    hdu 4119 Isabella's Message 模拟题
    hdu 4118 Holiday's Accommodation 树形dp
    UESTC 2015dp专题 N 导弹拦截 dp
    UESTC 2015dp专题 j 男神的约会 bfs
    UESTC 2015dp专题 H 邱老师选妹子 数位dp
  • 原文地址:https://www.cnblogs.com/5j421/p/10121421.html
Copyright © 2011-2022 走看看