面向对象与面向过程

面向对象与面向过程


目录

类与对象

类(Class)

定义类

self 关键字

“魔法方法”

对象(Object)

定义对象

获取属性及调用方法

面向对象(Object-Oriented,OO)

封装(Encapsulation)

继承(Inheritance)

多态(Polymorphism)

抽象类与抽象方法

面向对象的其它特征

面向过程(Procedural Programming)

面向对象与面向过程的区别


类与对象

类(Class)

对一类具有相同属性方法对象的抽象描述

属性(Attributes):描述对象的特征或状态(也称为成员变量)

方法(Methods):描述对象的行为或功能(也称为成员函数)

  • 定义类
class ClassName(object): attribute = value # 定义类的属性(变量) def __init__(self): self.attribute = value # 定义实例的属性【self关键字只能在函数内】 def function(self): # 定义类的方法(函数) pass
  • self 关键字

代表 指向 类 的当前实例对象(谁调用函数,self就是谁)

为 实例方法 提供 访问该实例自身属性和方法 的 引用

类方法的第一个参数,指向 调用该方法 的 实例对象

  • “魔法方法”

【在特殊情况下会被自动调用】

def __init__(): 在定义 对象 时会被自动调用执行

def __init__(self, color, number): self.color = color self.number = number

def __str__(): 在输出打印 对象的属性 时会被自动调用执行

def __str__(self): return self.attribute # 返回值的类型必须是字符串类型

def __del__(): 在 对象的生命周期结束时(被销毁) 时会被自动调用执行

def __del__(self): pass
对象(Object)

对象是类的实例,是根据类创建的具体实体,一个类可以创建多个对象

  • 定义对象
variable = ClassName()
  • 获取属性及调用方法

在类内获取属性及调用方法:

self.attribute # self.属性 self.function() # self.函数名()

在类外获取属性及调用方法:

variable.attribute # 变量名.属性 variable.function() # 变量名 . 函数名()

面向对象(Object-Oriented,OO)

一种编程范式(程序设计思想)一切皆对象】

以对象为核心,通过封装、继承、多态等机制,组织和复用代码

优点:模块化、复用性、灵活性

  • 封装(Encapsulation)

将数据(属性)和操作数据的方法(行为)绑定在一起 形成一个独立的对象

对外隐藏内部实现细节,仅暴露必要接口

【封装不只对于类的封装,也对于函数的封装】

封装可以为属性和方法添加私有权限(只能在类内访问)【类外通过公共方法(接口)访问】:

class ClassName(object): def __init__(self, value): self.__attribute = value # 定义私有属性 def __function(self): # 定义私有方法 return self.__attribute def function(self): # 定义公共方法,对外提供接口 return self.__function() # 调用私有方法,返回私有属性
  • 继承(Inheritance)

多个类之间的所属关系

子类(派生类)默认继承父类(基类、超类)的属性和方法

单继承:

class ClassName(object): # 定义父类 attribute = value def function(self): pass class Subclasses(ClassName): # 定义子类继承自父类 attribute = value def function(self): pass

多继承:

class ClassName(object): # 定义父类 attribute = value def function(self): pass class SubclassesOne(ClassName): # 定义子类继承自父类 attribute = value def function(self): pass class SubclassesTwo(ClassName, SubclassesOne): # 定义子类继承自两个父类 attribute = value def function(self): pass

子类调用父类方法:

class SubclassTwo(ClassName, SubclassesOne): ClassName.function() # 调用指定基类的函数 —> 父类名.方法名(self) super().function() # 只能调用传入的第一个父类的函数

子类调用父类的同名方法:

当一个类有多个父类时,默认使用第一个父类的同名属性和方法,具体调用顺序依据MRO

可以使用 类名.__mro__ 或 类名.mro() 方法查看调用的先后顺序

MRO(Method Resolution Order):方法解析顺序

方法重写:

当 子类属性或方法 与 父类的属性或方法 名字相同 时 从父类继承下来的成员可以 重新定义

多层继承:指多个类之间的继承的层级关系

  • 多态(Polymorphism)

同样一个函数在不同的场景下有不同的状态

多态的条件:

1、有继承 (定义父类、定义子类,子类继承父类)

2、函数重写 (子类重写父类的函数)

3、父类引用指向子类对象 (子类对象传给父类对象调用者)

class Bird: def fly(self): print("Bird can fly") class Penguin(Bird): def fly(self): print("Penguin cannot fly") class Eagle(Bird): def fly(self): print("Eagle can fly very high") def bird_flying_test(bird): bird.fly() bird = Bird() penguin = Penguin() eagle = Eagle() bird_flying_test(bird) bird_flying_test(penguin) bird_flying_test(eagle)

多态的优点:

提高代码的可扩展性和可维护性

提高代码复用性 使程序更易于扩展和修改

分离接口与实现

  • 抽象类与抽象方法

抽象类:含有 抽象方法 的 类

抽象方法:函数体是空实现的(pass)

class ClassName(object): def function_one(self): pass def function_two(self): pass

抽象类的核心特征:

1、必须包含抽象方法

2、不能被实例化

3、子类必须实现其抽象方法

  • 面向对象的其它特征

类属性:

在类内部、方法外直接定义(变量名 = 值)【类内函数外】

类中所有对象共享该属性 当某一对象修改类属性时,所有对象及类本身均受影响

通过 类名.属性名 的方式访问(推荐)

对象属性:

在函数中定义:在 init 方法(也属于函数)或实例方法中通过 self. attribute的方式定义

实例属性为某个对象所独有,修改某个实例属性仅影响当前对象

通过 对象名.属性名 的方式访问(易与实例属性混淆)

类方法:

必须传入参数:第一个参数 cls(指向类本身)

装饰器:@classmethod

class ClassName(object): @classmethod def function(cls): pass

静态方法:

无需固定参数

装饰器:@staticmethod

class ClassName(object): @staticmethod def function(): pass

面向过程(Procedural Programming)

一种以过程(Procedure)为核心的编程范式

核心思想:自顶向下、逐步分解

核心特点:

1、以函数为基本单元

2、线性执行流程:从主函数开始,依次调用其它函数

3、数据与操作分离

4、自顶向下的设计

面向对象与面向过程的区别

面向过程:以“过程”为中心,将程序分解为一系列步骤或函数,强调“如何做”。

面向对象:以“对象”为中心,将数据和行为封装为对象,强调“谁来做”。