面向过程 VS 面向对象
编程范式
实现一个任务有多种不同方式,对这些不同编程方式的特点进行归纳总结得出的编程方式类别,称为编程范式。
不同编程范式本质上代表对各种类型的任务采取不同的解决问题的思路。
面向对象编程、面向过程编程、函数式编程均为编程范式
面向过程编程
Procedural programming uses a list of instructions to tell the computer what to do step-by-step.
即编程时更多的关注如何将问题一步一步的解决掉。
面向对象编程
OOP编程是利用类和对象来创建各种模型来实现对真实世界的描述
世界万物皆可分类;世界万物皆为对象;
只要是对象,就肯定属于某一类,肯定有属性
面向对象的几个核心特征如下:
- Class类
一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象都具备的属性、共同的方法。
- Object对象
一个对象即是一个类的实例化后的实例。一个类必须经过实例化后方可在程序中调用。一个类可以实例化多个对象,每个对象可以有不同的属性。
- Encapsulation封装
在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法。
- Inherirance继承
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承。
- Polymorphism多态
即“一个接口,多种实现”,指一个基类中派生出了不同的子类,且每个子类在继承了同样的方法名的同时,又对父类的方法做了不同的实现,这就是同一种事物表现出的多种形态。
- 编程就是将一个具体世界进行抽象化
- 多态就是抽象化的一种体现,把一系列具体事务的共同点抽象出来,通过这个抽象事物与不同的具体事务进行对话。
多态允许将子类的对象当做父类的对象使用。
面向对象编程实例
例如定义一个狗:
class dog: #类名
n = 123 #类变量
def __init__(self,name):
#构造函数
#在实例化时做一些类的初始化工作
self.name = name #实例变量(赋给了实例)
def bulk(self): #类的方法,功能 (动态属性)
print("This is a dog %s: wang wang wang!" %self.name)
d1 = dog("张三") # 实例化(初始化一个类,造了一个对象)
d2 = dog("李四")
d3 = dog("王五")
d1.bulk()
d2.bulk()
d3.bulk()
>> This is a dog 张三: wang wang wang!
>> This is a dog 李四: wang wang wang!
>> This is a dog 王五: wang wang wang!
- 实例化时,相当于把d1传入定义的类中,替代self。
- 在init中进行实例化操作,后面的函数(方法)相当于是共用的
- 每个方法中至少都要包括一个self,这样就可以知道是哪个实例化的对象调用的。
如果类变量和实例变量名重复了,会优先找实例变量,找不到再去找类变量;
实例化对象中增加/删除属性:
# 在实例化对象中增加类中没有定义的属性
d1.food = True
# 删除类中的某个属性
del d1.name
类变量
当众多的实例对象拥有共同的属性特点,即可创建为类变量,如果创建为实例对象,则每个实例都会创建一份。
析构函数
在实例释放、销毁的时候执行的,通常用于做一些收尾工作
如关闭一些数据库连接,打开的临时文件。
class person():
def __init(self,name)
self.name = name
def __del__(self):
print("%s 退出了" %self.name)
程序退出的时候就会执行。主动删除时也会执行。
通常做一些收尾工作
私有属性
即属性前面加两个下划线
class person():
def __init(self,name,life)
self.name = name
self.__life = life
def got_life(self):
print("name:%s life:%s" %(self.name,self.__life))
def __del__(self):
print("%s 退出了" %self.name)
#外部访问不到
r1 = person("Lilin","100")
r1.__life()
此时,life即被隐藏了,外部是调用不到的,但内部可以调用到