python之面向对象(一)
python编程分为三个阶段:
- 面向过程编程:根据业务逻辑从上到下垒
- 函数式编程:将某功能进行函数封装,使用时调用函数即可,减少代码重复量
- 面向对象编程:对函数进行分类和封装
理论上我们是比较鄙视面向过程编程的,那么问题来了,那函数式编程和面向对象编程我们该用哪个呢?
先来看两个的特点吧:
- 函数编程,逻辑清晰,简单,为项目而生,维护困难,函数式编程提倡的解决方案是数据是不可变的, 就没有了一直在改变的状态, 从而降低了复杂度.
- 面向对象,大而全,复杂,为大项目而生,开发周期长,理论上长久维护简单,实际上一塌糊涂...面向对象一个最大的特点是抽象, 所以面向对象式编程特别适合处理业务逻辑,因此被广泛应用于目前的软件开发当中.
总结
-
那么什么情况下用面向对象呢?当某一些函数具有相同参数时,可以使用面向对象的方式,将参数值一次性的封装到对象,以后去对象中取值即可,我觉得这个是对于我这种初学者的最简答案了吧...
-
什么时候使用函数式编程呢?各个函数之间是独立且无共用的数据
类和对象的创建
面向对象编程方式的落地,需要使用类和对象来实现:
- 类可以看为一个模板,模板了包含了多个函数,函数实现某些功能
- 对象是根据模板创建的实例,通过实例对象可以调用类中的功能函数
那么我们来看一个例子吧:
- class是关键词,声明创建一个类
- 类后面加(),表示创建对象
- 类中定义函数时,第一个参数必须为self,而类中的函数称为方法
面向对象的三大特性
不是抽烟喝酒烫头....是
- 封装
- 继承
- 多态
封装
封装其实是分为两步:封装和调用!
step1
将内容封装到某处
从上面的图,我们可以看出一个问题,self是个什么东西?
self是一个python自动会给传值的参数那个对象执行方法,self就是谁!
类中有一个特殊的方法,叫构造方法:init,类会自动执行,我们可以用__init__方法来传入变量,初始化一些基础数据.
step2
调用就比较简单了,可分为两种情况:
- 通过对象直接调用被封装的内容
- 通过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)
先上两张图:
深度优先,无共同父类,多继承方式
广度优先,有共同的父类,多继承方式,最后才去找共同的父类,
未完待续....