python之面向对象(一)

python编程分为三个阶段:

  1. 面向过程编程:根据业务逻辑从上到下垒
  2. 函数式编程:将某功能进行函数封装,使用时调用函数即可,减少代码重复量
  3. 面向对象编程:对函数进行分类和封装

理论上我们是比较鄙视面向过程编程的,那么问题来了,那函数式编程和面向对象编程我们该用哪个呢?

先来看两个的特点吧:

  • 函数编程,逻辑清晰,简单,为项目而生,维护困难,函数式编程提倡的解决方案是数据是不可变的, 就没有了一直在改变的状态, 从而降低了复杂度.
  • 面向对象,大而全,复杂,为大项目而生,开发周期长,理论上长久维护简单,实际上一塌糊涂...面向对象一个最大的特点是抽象, 所以面向对象式编程特别适合处理业务逻辑,因此被广泛应用于目前的软件开发当中.

总结

  • 那么什么情况下用面向对象呢?当某一些函数具有相同参数时,可以使用面向对象的方式,将参数值一次性的封装到对象,以后去对象中取值即可,我觉得这个是对于我这种初学者的最简答案了吧...

  • 什么时候使用函数式编程呢?各个函数之间是独立且无共用的数据

类和对象的创建

面向对象编程方式的落地,需要使用类和对象来实现:

  • 类可以看为一个模板,模板了包含了多个函数,函数实现某些功能
  • 对象是根据模板创建的实例,通过实例对象可以调用类中的功能函数

那么我们来看一个例子吧:

我是图

  • class是关键词,声明创建一个类
  • 类后面加(),表示创建对象
  • 类中定义函数时,第一个参数必须为self,而类中的函数称为方法

面向对象的三大特性

不是抽烟喝酒烫头....是

  1. 封装
  2. 继承
  3. 多态

封装

封装其实是分为两步:封装和调用!

step1

将内容封装到某处
我是图

从上面的图,我们可以看出一个问题,self是个什么东西?

self是一个python自动会给传值的参数那个对象执行方法,self就是谁!

类中有一个特殊的方法,叫构造方法:init,类会自动执行,我们可以用__init__方法来传入变量,初始化一些基础数据.

step2

调用就比较简单了,可分为两种情况:

  1. 通过对象直接调用被封装的内容
  2. 通过self间接调用被封装的内容
class foo:
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def test(self):
        print('I am %s,age:%s'%(self.name,self.age))


obj=foo('cc',22)
print(obj.name)	#通过对象直接调用
print(obj.age)
print('=======================')
objx=foo('cengc','33')
objx.test()			#通过self间接调用

out:


cc
22
=======================
I am cengc,age:33

总结下:面向对象的封装,其实就是使用构造方法,将内容封装到对象中,然后通过对象直接或者self间接获取被封装的内容

继承

对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法,也可以这么认为:父类中的所有函数copy到了子类中.

继承的叫法分为两种:父类/子类,基类/派生类.

一个典型的继承的例子:

class it:
    def __init__(self,name):
        self.name=name

    def woker(self):
        print('i am a iter,my name is %s'%(self.name))


class coder(it):
    def coding(self):
        print('i am coding now!')

a=coder('cc')
a.coding()
a.woker()

输出:

i am coding now!
i am a iter,my name is cc

需要注意的是:如果类中,包括子类的父类中定义了构造方法的参数时,创建对象需要传入相应的参数值!

多继承

python中的继承可以多继承,意思就是一个子类可以有多个父类,比如:

class a(b,c,d,e):   #b,c,d,e为类
	def xxx(self):
	pass

多继承中需要注意的是:

  • 多继承时,按照继承的顺序排优先级c3(c2,c1)

先上两张图:

深度优先,无共同父类,多继承方式

图

广度优先,有共同的父类,多继承方式,最后才去找共同的父类,
图

未完待续....

posted @ 2016-06-20 18:20  ccorz  阅读(333)  评论(0编辑  收藏  举报