• 面对对象之继承、组合等


      关于继承

      抽象与继承

      覆盖、派生

      组合

      子类调用父类的方法

    关于继承

      

    继承我们可以把它看成一种关系,用来描述两个对象之间的关系,在程序中,继承也就是类与类之间的关系,继承也就是用来创建一种新类,新建的类可以继承一个父类也可以继承多个父类。

    python中继承的特点:

    1.子类可以遗传/重用父类的属性

    2.python中一个子类可以同时继承多个父类

    3.在继承的背景下,python的类分为两种,新式类和经典类

         新式类:但凡继承了object的类Foo,以及该类的子类...都是新式类。在python3中一个类即便是没有显式地继承任何类,默认就会继承object,即python3中所有的类都是新式类。

         经典类:没有继承object的类,以及该类的子类...都是经典类。在python2中才区分新式类与经典类,在python2中一个类如果没有显式地继承任何类,也不会继承object。

    使用继承的好处:可以减少类与类之间代码冗余。

    #单继承与多继承的语法
    class ParentClass1: #定义父类
        pass
    
    class ParentClass2: #定义父类
        pass
    
    class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
        pass
    
    class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
        pass
    #查看继承  __bases__是查看所有继承的父类
    class A:
        pass
    
    class B:
        pass
    
    class C(A):
        pass
    
    class D(A,B):
        pass
    
    print(C.__bases__)  # (<class '__main__.A'>,)
    print(D.__bases__)  # (<class '__main__.A'>, <class '__main__.B'>)

      抽象与继承

      继承描述的子类和父类的之间的关系,是一种什么是什么的关系。要找出这种关系,必须先抽象再继承。

    抽象即抽取类似或者说比较像的部分,把抽取的相似部分形成一个新的类。

    抽象的过程:

    1.将麦兜和猪坚强这俩对象比较像的部分抽取成类; 

    2.将人,猪,狗这三个类比较像的部分抽取成父类。

    抽象最主要的作用是划分类别(可以隔离关注点,降低复杂度)

    继承是基于抽象的结果,通过编程语言去实现它,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构。抽象只是分析和设计的过程中,一个动作或者说一种技巧,通过抽象可以得到类。

      覆盖、派生

        覆盖

    #当子类出现了与父类的名称完全一致的属性或是方法时,会优先使用子类中的
    class Person:
        def say_hi(self):
            print("hello")
    
    class Student(Person):
        def say_hi(self):
            print("hello world!")
    
    stu = Student()
    stu.say_hi()  # hello world!

        派生

    #当一个子类中出现了与父类中不同的内容时,这个子类就称之为派生类,通常子类都会写一些新的代码,不可能和父类完全一样 , 既通常都是派生类,所以派生类指的就是子类。
    
    class Animal:
        '''
        人和狗都是动物,所以创造一个Animal基类
        '''
        def __init__(self, name, aggressivity, life_value):
            self.name = name  # 人和狗都有自己的昵称;
            self.aggressivity = aggressivity  # 人和狗都有自己的攻击力;
            self.life_value = life_value  # 人和狗都有自己的生命值;
    
        def eat(self):
            print('%s is eating'%self.name)
    
    class Dog(Animal):
        '''
        狗类,继承Animal类
        '''
        def bite(self, people):
            '''
            派生:狗有咬人的技能
            :param people:  
            '''
            people.life_value -= self.aggressivity
    
    class Person(Animal):
        '''
        人类,继承Animal
        '''
        def attack(self, dog):
            '''
            派生:人有攻击的技能
            :param dog: 
            '''
            dog.life_value -= self.aggressivity

      组合

      组合也是一种关系,将一个对象作为另一个对象的属性。组合的作用也是为了重用现有的代码。

    class Phone:  # 定义一个电话的类
        def __init__(self,price,kind,color): 
            self.price = price
            self.kind = kind
            self.color = color
    
        def call(self):
            print("正在呼叫XXXX;")
    
        def send_message(self):
            print("正在发送短信....")
    
    
    class Student:  # 定义一个学生的类
        def __init__(self,name,gender,phone):  # 将电话作为学生的一个属性
            self.name = name
            self.gender = gender
            self.phone = phone 
    
        def show_info(self):
            print("name:%s gender:%s" % (self.name,self.gender))
    
    phone = Phone(1000,"apple","red")  # 产生一个电话对象
    stu1 = Student("rose","male",phone)  # 产生一个学生的对象,并将电话对象作为它的属性输入
    stu1.phone.call()  # 通过学生对象调用电话的功能

      子类调用父类的方法

    方法一:指名道姓,即父类名.父类方法()

    class Vehicle: #定义交通工具类
         Country='China'
         def __init__(self,name,speed,load,power):
             self.name=name
             self.speed=speed
             self.load=load
             self.power=power
    
         def run(self):
             print('开动啦...')
    
    class Subway(Vehicle): #地铁
        def __init__(self,name,speed,load,power,line):
            Vehicle.__init__(self,name,speed,load,power) 
            self.line=line
    
        def run(self):
            print('地铁%s号线欢迎您' %self.line)
            Vehicle.run(self)  # 通过类名调用父类方法
    
    line13=Subway('中国地铁','180m/s','1000人/箱','',13)
    line13.run()

      方法二:super()

    class Vehicle: #定义交通工具类
         Country='China'
         def __init__(self,name,speed,load,power):
             self.name=name
             self.speed=speed
             self.load=load
             self.power=power
    
         def run(self):
             print('开动啦...')
    
    class Subway(Vehicle): #地铁
        def __init__(self,name,speed,load,power,line):
            #super(Subway,self) 就相当于实例本身 在python3中super()等同于super(Subway,self)
            super().__init__(name,speed,load,power)
            self.line=line
    
        def run(self):
            print('地铁%s号线欢迎您' %self.line)
            super(Subway,self).run()
    
    class Mobike(Vehicle):#摩拜单车
        pass
    
    line13=Subway('中国地铁','180m/s','1000人/箱','',13)
    line13.run()
  • 相关阅读:
    ORA-**,oracle 12c操作问题
    [MySQL] specified key was too long max key length is 767bytes
    ActiveMQ objecmessage 无法调用问题。
    关于IPMI的几个问题
    Linux平台上SQLite数据库教程(一)——终端使用篇
    0ra-12170 tns 连接超时
    iBatis应用--控制执行SQL时的超时时间
    深入理解JDBC的超时设置
    oracle关键字作为字段名使用方法
    Java中使用OpenSSL生成的RSA公私钥进行数据加解密
  • 原文地址:https://www.cnblogs.com/AbrahamChen/p/11247287.html
Copyright © 2020-2023  润新知