面向过程与面向对象

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‘}

 














以上是关于面向过程与面向对象的主要内容,如果未能解决你的问题,请参考以下文章

面向过程编程与面向对象编程

面向对象与面向过程

代码学习PHP面向对象之类与对象

Android-Java-面向对象与面向过程的简单理解

面向对象与面向过程

3 面向过程与面向对象进一步比较