zoukankan      html  css  js  c++  java
  • 第7章 Python类型、类、协议 第7.1节 面向对象程序设计的相关知识

    Python被视为一种面向对象的语言,在介绍Python类相关的内容前,本节对面向对象程序设计相关的概念进行简单介绍。

    一、    类和对象(实例)
    在面向对象的程序设计(OOP)过程中有两个重要概念:类(class)和对象(object,也被称为实例,instance),其中类是某一批对象的抽象,是抽象的模板。类是由其属性以及支持的方法定义的,类的所有实例都有该类的所有属性和方法,每个对象都属于特定的类,是一个具体存在的实体,是根据类创建出来的一个个具体的“实例”。
    类、类型在Python3中是同义词。从很多方面来说,这正是类的定义——一种对象。每个对象都属于特定的类,并被称为该类的实例。在Python中,类名约定使用单数并将首字母大写,如Student和Person。
    对象由属性(数据)和方法组成,属性是属于对象的变量,而方法是存储在属性中的函数。每一个对象都从类中继承有相同的方法,但各自的数据可能不同。对象的状态由其属性(如名称)描述,对象的方法可能修改这些属性,因此对象将一系列函数(方法)组合起来,并赋予它们访问一些变量(属性)的权限,而属性可用于在两次方法调用之间存储状态。

    二、    子类和超类
    一个类的对象(如猪、牛、羊)为另一个类(如家畜)的对象的子集时,前者就是后者的子类,后者是前者的超类(也称为父类、基类)。要定义子类,只需定义多出来的方法和属性,还可能重写一些超类的方法。因此从功能上来说,父类的属性和方法是子类的功能和方法的子集。子类的所有实例都有超类的所有属性和方法。子类比超类会多出特有的属性或方法,或可能重写一些超类的方法。
    对于子类和超类,在C++中调用时有两种类型的强制类型转换:
    1.    向上类型转换(upcast):将子类型引用转换成父类型引用。
    2.    向下类型转换(downcast):将父类型引用转换成子类型引用。对于向下类型转换,必须要显示指定。向下类型转换的原则:父类型引用指向谁才能转换成谁。
    而在Python中,则无需关注这种转换,Python编译时不执行类型检查,执行时也不建议使用代码进行类型检查,只关注对象是否有对应方法。

    三、    面向对象的特征
    Python是一门面对对象编程的语言,面向对象程序设计有三大特征:封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)。
    1.    封装:对象可能隐藏其内部状态,对外部隐藏有关对象工作原理的细节,使用者无需知道对象的构造就能使用它。
    1)    在有些语言如C++中,这意味着对象的状态(属性)只能通过其方法来访问;
    2)    封装就是对对象的部分或全部内部数据进行隔离,隐藏数据特征。这是因为对象中的数据(属性)可能有特殊的操作方法,如果通过外部直接访问数据可能导致异常和错误;
    3)    在Python中,所有的属性都是公有的,都可以通过外部访问,但直接访问对象的状态时程序员应谨慎行事,因为这可能导致状态不一致,为此Python没有提供对象强制的访问类型限制,但通过命名规则(前导双下划线)可以隐式地定义无法直接访问的内部属性。具体内容请见后面章节。
    2.    继承:继承,一个类可以是一个或多个类的子类,在子类没有重写超类(也称父类、基类,下同)方法的情况下,子类可以使用超类(父类)的方法。继承可以让子类获得超类的全部功能,超类实现过的方法,子类不需要重新定义就能自动拥有。
    1)    并不是所有语言都支持指定继承多个超类,Python支持继承多个超类;
    2)    可以为子类增加新的方法,这些新方法父类不会掌握。如果子类新定义的方法与父类的方法相同,则子类的方法覆盖父类的方法。在程序运行时总是会调用子类的方法而不是父类的方法。
    3)    Python对多个超类的使用并不推荐,因为多个超类的情况下,如果某个方法在多个超类中出现,系统可能出现异常。
    3.    多态:多态指的是无需知道对象属于哪个类就可调用其方法,对不同类型的对象执行相同的操作。
    1)    多态有2种形态
    i.    一种是一个超类的多个子类,不同子类中有同样名称的方法,相关方法可能是继承超类的,也可能是子类重写了的,但在调用该方法时,无需知道具体子类的类型。当使用多态方式调用方法时,首先检查父类中是否有此方法,如果没有则编译错误,如果有则再去调用子类重写(Override)【如果重写的话】的此方法,没有重写的话,还是调用从父类继承过来的方法。
    ii.    另一种是不同类型都有某些相同的方法,不论该方法是否继承超类、是否方法来自相同的超类、无需关注对应对象是什么类型,只需该对象有对应方法就可以使用。这就是Python支持的“鸭子类型”,关于“鸭子类型”在后面章节专门介绍。
    iii.    传统意义的多态主要是指第一种类型的多态,不含第二种类型的多态,所以有人说Python不支持多态,但Python是一种多态语言。
    2)    多态是一种运行时行为,不是编译期行为!在编译期间它只知道是一个引用,只有到了执行期,引用才知道指向的是谁。这就是所谓的“软绑定”。

    本节介绍了面向对象程序设计相关的基本概念,有关内容涉及面较广,如果大家不好理解,建议自己多找点资料看看。
    老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
    欢迎大家批评指正,谢谢大家关注!
     

  • 相关阅读:
    rsyslog 只读取变化的日志
    Invalid component element. Instead of passing a string like 'div', pass React.createElement('div')
    Java 并发之 CountDownLatch、CyclicBarrier 和 Semaphore
    JUC (Java Util Concurrency) 基础内容概述
    浅析Java中CountDownLatch用法
    java 多线程 CountDownLatch用法
    基于Netty的“请求-响应”同步通信机制实现
    响应头location 页面跳转
    8.1 Optimization Overview
    论人不地道,我只佩服TT——北漂18年(68)
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/11087712.html
Copyright © 2011-2022 走看看