面向过程与面向对象
Posted guyanzhi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向过程与面向对象相关的知识,希望对你有一定的参考价值。
1、面向过程(procedure-oriented programming):
(POP)之前所写的代码大多是面向过程的,即,以流程为导向,先做...后做...这其中 programer 的角色像是流水线员工、士兵,按部就班执行任务
优点:复杂问题流程化,不管多复杂的功能,都可以将其分解,从而简化
缺点:流水线式的功能实现方式导致维护性扩展性差
面向过程主要用于底层开发,比如系统内核脚本程序等,Apache HTTP服务器, 当程序需要经常扩展,面向过程的方式就不太适合了
2、面向对象(object-oriented programming):
(OOP)实现功能的方式是各个对象的交互 (这里的对象---比如之前学的函数对象), 这其中 programer 的角色更像是上帝、指挥者. 对象是具有某些具体功能特征的具体事物,它具有某些属性,类是从对象抽象出来的概念 比如 Dog是类,一只叫旺财的 会摇尾巴的Dog是对象,需要注意类和对象的区别.
生活中,先有对象然后诞生了类 ,而在程序中,先创建类及其特征,再创建具有这个类的特征的对象
在进一步学习面向对象前,需要先了解一下类和类的实例化---对象(也可以称之为实例)
类有属性和方法,在类中已经定义好(名称和值)的属性---------公共属性 # 比如一个人出生就具有国籍属性 是固定的
对象也有属性,它除了可以继承公共属性,还拥有自己的属性-------成员属性(实例属性) # 这个人有自己的姓名
在声明类时,会定义好成员属性(成员属性的值是个变量)
在定义对象时,为成员属性(变量)赋值(位置参数)
- 公有属性/静态属性 可以直接通过类直接访问,也可以直接通过实例进行访问;
- 通过类的某个实例对公有属性进行修改,实际上是为该实例添加了一个与类的公有属性名称相同的成员属性,
对真正的公有属性是没有影响的,因此它不会影响其他实例获取的该公有属性的值;
- 通过类对公有属性进行修改,必然是会改变公有属性原有的值,对该类所有的实例是都有影响的。
- 成员属性可以直接通过实例对象来访问和更改;不能通过类来访问和修改
- 成员属性是每个实例对象独有的,更改实例A的属性不会影响其他实例对象的相同属性的值;
下面开始学习怎样定义和使用类与对象
# 笨拙的定义一个类 class Person: # 添加一个属性 值为地球人 name = "地球人" # 定义一个实例 person01 = Person # 定义实例的属性 # name 如果没有在实例中设置name,它会继承它所属类的name属性 person01.name="tom" # 查看姓名属性 print(person01.name)
当然,还有更简便的方便,我们以后使用如下初始化函数的方式:
# 用初始化方法定义一个类 可以更简单 class Person(object): nationality = "China" # 这是一个初始化函数,其实可以自己在class的代码块外写一个func(obj_name,attribute...) # 将其当作初始化函数,即当定义了一个实例后,将成员属性传入这个函数 就完成了初始化 # 但是这样不能将类和初始化联系起来,故而 python将这个函数放到class 子代码块里... # __init__ 就是这个函数,会在声明一个类时自动执行 self 就是对象本身 def __init__(self,name,gender): self.name = name self.gender = gender def talk(self): print("%s is talking"%self.name) def laugh(self): print("%s is laughing"%self.name) # 定义一个 对象(实例) # 成员属性 # 属性 姓名 性别 tom = Person("tom","man") # 设置成员属性的值 # 查看对象的 属性字典 可知:对象具有类的属性方法 print(Person.nationality) # 国籍是公共属性 print(tom.nationality) print(tom.__dic) # get attribute of Classobject : {‘name‘: ‘tom‘, ‘gender‘: ‘man‘}
以上是关于面向过程与面向对象的主要内容,如果未能解决你的问题,请参考以下文章