Python基础【面向对象】

面向对象


从面向过程到面向对象

面向过程

在计算机编程发展之初,解决一个客观问题的思路往往是通过设计算法
去对数据进行分析处理最终给出结果。

        例如:完成一组数据的排序,生成特定的数列
        从一组数据中筛选出符合条件的数据等等。

在面向过程的编程中,解决问题是以功能为起点
分析问题主要从**依附在事物上的行为** 出发
面向过程的编程重在 **如何一步步完成这一行为** 

        例如:顾客购物可以简要描述为:
                    顾客进入商店,选择商品,付钱,离开商店

为什么需要**面向对象**?

但随着需要解决的问题的规模和复杂度逐渐增加
面向过程的思想在进行程序设计时
需要分析和处理的数据就变得非常庞大
不利于设计者对问题的分析和处理,并且在一定程度上限制了程序的运行效率。

面向对象的思维

客观事物描述的时候往往围绕着 **从中抽象出的主要个体**
        例如:购物这一事件围绕 顾客、店主 和 商品 发生。

在对 **个体** 进行数据分析时,往往可以通过一些 **特性(具有的属性)和行为(进行的动作)** 进行描述
        例如:顾客拥有 现金余额 等属性,可以实施 购买商品 等行为。

这些独立的个体都可以进行相应的**数据处理**,相互之间可以进行**信息的传递**,作为独立的通信个体

事实上,客观事物描述时大多都可以抽象成 **多个独立对象之间进行信息传递和处理** 的类似模型来进行分析。

换句话说,相比面向过程代码复杂度随着行为的多变性增加,面向对象的思维在编程时更为通用,独立对象的行为/属性变化不会影响其他部分,更不会导致整体需要调整。

在具体问题中,抽象出的有用的对象属性和行为越具体,描述越精确,抽象出的模型越接近现实情况,具体需要抽象到什么程度,需要根据需求进行分析。

        例如:
                    如果只需要知道顾客购买了什么商品,方便统计数量,可以通过添加商品对象,对其数量进行统计分析即可
                    但如果还需要进行财务管理,就需要给商品增加价格这一属性,进一步进行数据处理

面向对象和面向过程的关系

尽管面向对象在面对复杂问题时具有较大优势,面向过程仍为面向对象的基础

对象的行为如何实施,对象之间的数据传递和处理等仍需要面向过程的思想为基础进行编写。

面向对象编程中的基本概念(个人理解)

类:具有同一类属性和方法的对象的集合(模板)(类也可看作是一种数据结构)

方法:定义在类中的函数

对象:具有类中属性和方法的具体的独立个体,即类的实例化个体

类变量(类属性):定义在类中(方法外)的变量,类和实例对象通用,可以在外部直接通过类名(对象名).属性名的形式进行访问

类对象:类本身也是一个特殊对象,在创建类时,会在内存中存放

实例化:创建一个具体的对象即为类的实例化

继承:在定义类A时,可以在类名后加(B),其中B也为一个类对象,表示A类拥有B类的属性和方法,无需重新定义,类似于现实生活中的继承关系,A类也可在定义中添加自己的属性和方法。

方法重写:当继承父类的方法无法满足需求时,派生类(子类)可以在类内重写方法(同名)以满足需求

基类(父类):A类继承B类的属性和方法,则A类就是B类的基类(父类)

派生类(子类):A类继承B类的属性和方法,则B类就是A类的派生类(子类)

面向对象的三大特性(相比面向过程)

封装

面向对象的语言将某个个体的属性和行为进行封装**(类)**,作为一个独立的逻辑单元进行分析处理

继承

子类从父类中继承其属性及方法,也可在子类中加入新的属性及方法

多态

相同的 函数或数据 作用或传递 到不同的对象中,执行或处理 的结果也不同

类的定义

class A: # A为类名
    variable=0 # 类变量
    def __init__(self): # 初始化方法
        函数体
    def fun(self): # 方法
        函数体

类的实例化(利用类创建对象)

a = A # 以类A为模板创建一个名为a的对象
属性访问
print (a.variable) # 输出类变量的值,利用对象名.变量名访问
方法调用
a.fun() # 调用方法

方法:

普通方法:

方法在类中定义时
参数:会强制添加第一个参数并指向类的实例化对象(默认参数名为self,也可自行定义)
调用方式:对象名.方法名()

类方法:

类方法:利用classmethod装饰的方法
参数:会强制添加第一个参数并指向类本身(默认参数名为cls,也可自行定义)
调用方式:类名.方法名() 或者 对象名.方法名()

静态方法 :

静态方法 :利用staticmethod装饰的方法
参数:没有强制参数,形式上与普通函数无异,只是在类中
调用方法:类名.方法名() 或者 对象名.方法名()

注:

- 方法中self参量指向**实例对象**,类方法中cls参量指向**类本身**,可用于在方法中访问实例/类中的属性和方法
- 类自身也是一种特殊的对象

例:

class A: # 定义A类
    def fun(self): # 普通方法
        ...
    此处应有at符classmethod
    def class_fun(cls): # 类方法
        ...
    此处应有at符staticmethod
    def static_fun(): # 静态方法
        ...
a = A # 以A为模板创建名为a的对象
a.fun() # 调用普通方法
A.class_fun() # 类名调用类方法
a.class_fun() # 对象名调用类方法
A.static_fun() # 类名调用静态方法
a.static_fun() # 对象名调用静态方法

类的特殊方法:

__init__(self):类的初始化方法(构造方法),创建对象时调用
__def__(self):  类的析构方法,释放对象时调用。
__str__(self):打印,利用print输出对象时输出的信息,必须有字符串型的返回值,否则报错
__repr__(self):效果上和__str__相同,单调用的时机不同

新式类和经典类(旧式类)

Python2中默认继承经典类,新式类需要继承自object
Python3中默认继承新式类
经典类:
        ➤在多继承时采用MRO算法,深度优先
        ➤相同父类执行多次构造函数
新式类:
        ➤在多继承时采用C3算法广度优先
        ➤相同父类执行一次构造函数

分享文章:Python基础【面向对象】
分享地址:http://ybzwz.com/article/ipeoss.html