zoukankan      html  css  js  c++  java
  • Python基础系列讲解——继承派生和组合的概念剖析

    Python作为一门面向对象的语言,它的面向对象体系中主要存在这么两种关系,一个是“类”和“实例”的关系,另一个是“父类”和“子类”的关系。

    所谓“类”是从一堆对象中以抽象的方式把相同的特征归类得到的,“类”本身也是对象,可以更进一步抽象得到“抽象类”,“类”和“抽象类”两者的区别在于前者是从现实对象抽象而来的,后者是基于类抽象而来的,因此“抽象类”只能被继承,不能被实例化,好比我们有香蕉的类、苹果的类、桃子的类,从这些类抽取相同的特征就是水果这个“抽象类”,我们吃水果时要么是吃一个具体的香蕉,要么是吃一个具体的桃子,无法吃到一个叫做水果的东西。

    那么我们抽象得到的“抽象类”之后可以继承的方式创建新类,此时原始类称为“父类”或“超类、基类(Base class、Super class)”,新类称为“子类”或“派生类”,当然抽象得到的“类”是可以创建“实例”的。总的来看,无论是继承还是实例化,它们的前提是抽象过程,只有抽象得到“类”后才能展开继承和实例化过程。

    这里举个形象的例子来说明下,比如奥巴马和梅西这两个对象抽象得到的共同的特征是人,那么人作为奥巴马和梅西的一个“类”,将人、猪、狗这三个“类”抽象得到的共同的特征是动物,那么动物作为人、猪、狗的一个“父类”。反过来人、猪、狗这三个“类”继承动物这个“父类”的特征,人这个“类”实例化得到了奥巴马和梅西这两个“对象”。

    图片描述

    图片描述

    对于继承和派生来说最大的好处是实现代码的重用,比如我们定义了一个类ParentClass1,接着打算新建立另外一个类SubClass1,由于两者的大部分内容相同,此时可以通过继承的方式让SubClass1继承ParentClass1,这样SubClass1则包含了ParentClass1所有的属性,包括了变量(self.name、self.age)和方法(speak),降低了重复的编程工作量,并且派生得到的SubClass1中可以添加新的属性,比如变量self.country和方法write,并不会影响到ParentClass1。(当子类新增的属性与父类重名时,以子类的为准)

    class ParentClass1: 
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def speak(self):
            print('speak ParentClass1')
    
    class SubClass1(ParentClass1): 
        def __init__(self, name, age, country):
            ParentClass1.__init__(self, name, age)     
            self.country = country          
            
        def write(self):
            print('write SubClass1')
    
    
    b1 = SubClass1('jack', 21, 'China')  
    print(b1.name) ——> jack
    print(b1.age) ——> 21
    print(b1.country) ——> China
    b1.speak() ——> test ParentClass1
    b1.write()  ——> test SubClass1'

    叉车轮胎更换

    上面展示的子类继承一个父类,那么子类也可以继承多个父类。比如子类SubClass2继承了ParentClass1和ParentClass2这两个类。

    class ParentClass1: 
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def speak(self):
            print('speak ParentClass1')
    
    class ParentClass2: 
    def walk(self):
        print('walk ParentClass2')
    
    class SubClass2(ParentClass1,ParentClass2): 
        def __init__(self, name, age, country):
            ParentClass1.__init__(self, name, age)     
            self.country = country          
    
    b2 = SubClass2('jack', 21, 'China')
    b2.speak() —— > speak ParentClass1
    b2.walk() —— > walk ParentClass2
    

    除了继承外,组合方式是将其他类作为属性加入到类中来扩展自身的属性资源,这样可以有效地利用其他类的资源,增强代码的重用性。组合与继承的区别主要体现在概念思想上:继承建立的“父类”和“子类”的关系是一种“是”的关系,比如程序员是人类,当“父类”和“子类”之间有很多共同的属性时使用继承比较合适;组合建立的类和组合类的关系是一种“有”的关系,比如程序员有电脑,会编程,而人类并不一定都具备,这样可以把电脑这个“类”以组合的方式添加作为属性,而不用重新再设计这个属性。

    class Human: 
        def __init__(self, name, age):
            self.name = name
            self.age = age
        def speak(self):
            print('Human speak skill')
           
    class Computer:
        def __init__(self, model ,brand):
            self.model=model
            self.brand=brand
            
    class Programmer(Human):  
        def __init__(self, name, age, country, computer):
            Human.__init__(self, name, age)    
            self.country = country          
            self.computer = computer
    
        b3=Programmer('jack', 21, 'China',Computer('X10','dell'))
        print(b3.computer.model,b3.computer.brand) —— > ('X10','dell')
  • 相关阅读:
    内敛函数
    墓碑文件
    java默认继承
    Question2Answer初体验
    yii 事物
    情商
    jsonp跨域
    CDbConnectionExt.php 23.2实现数据库的主从分离,该类会维护多个数据库的配置:一个主数据库配置,多个从数据库的配置
    图片服务器规划漫谈
    c语言中返回结构体的函数(结构体可以被赋值,类型相同的结构体可以相互赋值)
  • 原文地址:https://www.cnblogs.com/xyou/p/9705877.html
Copyright © 2011-2022 走看看