一、概述
python作为一门高级语言,也是面向对象的,在学习面向过程编程中,我们会很据业务需要自上而下进行编写代码,进一步发现这样会导致大量代码重用,所以我们改用函数式编程,将代码封装在一个函数中,日后便不需要重复写代码,只需要调用即可。我们都知道,在python中,一切都是对象,对象都是由类来创建的,为了以后让我们的开发越快越强越好,我们必须掌握面向对象编程。
二、概念(oop编程)
1、面向对象:将函数进行分类和封装,让开发变得perfect。
2、面向对象并不神秘,它只是一种编程方式,是对“对象”和“类”的使用,然而类就是一个模板,里面 包含很多函数,函数里实现功能(在类中将函数叫做方法),而对象是根据类创建的实例,根据实例对 象可以执行类中的方法。
3、创建类:
class province: #创建类 def shanxi(self): print "山西" def henan(self,name): print "%s 是河南的省会" %name obj = province() #根据类创建对象 obj.shanxi() #执行shanxi方法 obj.henan("郑州")#执行henan方法
class是关键字,表示类
创建对象类名后面直接加括号即可
小结:
可以看出面向对象编程是通过创建对象,对象调用方法来执行,而函数式编程是通过执行函数
三、面向对象之三大特性
面向对象三大特性:封装、继承、多态
对于python的面向对象来说,不支持多态也用不到多态,所以我们就一心一意学python的封装和继承就好
1、封装
封装:就是把内容封装在某个地方,等用的时候再去调用,即1、将内容封装到某处,2、在某处调用封装的 内容
下面详解介绍如何操作:
第一步:将内容封装到某处
class Foo: #创建类Foo def __init__(self,name,age): #称为析构方法,根据类创建对象时自动执行, self.name = name self.age = age #根据类Foo创建对象obj,自动执行__init__方法 #将"tom"和18封装在obj的name和age属性中。 obj = Foo("tom",18)
解释self:
self是一个形式参数,当执行obj = Foo("tom",18)时,self等于obj,指的是变量本身,按照惯例称之为self
第二步:从某处调用被封装的内容
调用有两种方式
1、用创建的对象直接调用
实例:调用方法为对象.属性名。例如:obj.name,obj.age
class Foo: #创建类Foo def __init__(self,name,age): #称为析构方法,根据类创建对象时自动执行, self.name = name self.age = age #根据类Foo创建对象obj,自动执行__init__方法 #将"tom"和18封装在obj的name和age属性中。 obj = Foo("tom",18) print obj.name #用创建的对象obj直接调用属性name print obj.age #用创建的对象obj直接调用属性age
2、用self间接调用
执行类中的方法时通过self间接调用被封装的内容
class Foo: #创建类Foo def __init__(self,name,age): #称为析构方法,根据类创建对象时自动执行, self.name = name self.age = age def hello(self): print self.name print self.age #根据类Foo创建对象obj,自动执行__init__方法 #将"tom"和18封装在obj的name和age属性中。 obj = Foo("tom",18) print obj.name #用创建的对象obj直接调用属性name print obj.age #用创建的对象obj直接调用属性age obj.hello() #python会默认将obj传给self参数,即obj.hello(obj),内部变为self=obj, self.name="tom",self.age=18
总结:
面向对象的封装就是使用构造方法将内容封装到对象中,然后通过对象直接或者采用self间接获取被封装的内容。
2、继承
在python中的继承也是子继承父(专业术语,基类和派生类)
对于面向对象的继承,就是将多个类共同的方法提取到父类中,子类只需继承父类即可,从而减少子类一一去实现每个方法。
对于python与其它语言不同的是,python支持多继承
而多继承是怎么实现的呢?以及有哪些注意的事项呢?
先介绍两个概念:经典类和新式类
从一般写法上区别:如果当前类或者父类继承了object类,那么就是新式类,反之就是经典类。举例为:
这样一来继承的方式就不一样了
经典类多继承服从深度优先,而新式类多继承服从广度优先。麻烦来了,何为深度优先和广度优先,画图表示为:
经典类多继承用代码表示为:
class D: def hello(self): pass class C(D): def hello(self): pass class B(D): def hello(self): pass class A(B,C): pass obj = A() obj.hello()
执行obj.hello()时,先在A类中找,若没有,再去B类中找,若没有再去D类中找,若没有再去C类中找,若C中也没有,就直接报错。在查找过程中,如果找到就不再继续找了,就中断了。
顺序为A-->B----D---->C,
新式类多继承代码为:
class D(object): def hello(self): pass class C(D): def hello(self): pass class B(D): def hello(self): pass class A(B,C): pass obj = A() obj.hello()
执行obj.hello()时,先从A类中找,若没有在B类中找,若没有再C类中,若没有D类中找,若没有直接报错。在查找过程中,如果找到就不再继续找了,就中断了。
执行顺序为:A-->B----C---->D
用几个小问题总结一下面向对象的知识
1)什么样的代码才是面向对象?
答:程序中的所有功能都是用类和对象实现的代码,一般在实际编程中,都是和函数式编程混合使用的。
2)面向对象的应用场景
1、多函数使用相同的值,例如,数据库的增删改查操作都需要连接数据库字符串、主机名、用户名和密码
2、需要创建多个事物,每个事物属性个数相同。
3)类和对象在内存中是如何保存的?
类以及类中的方法在内存中都只有一份,而根据类创建的对象在内存中都要每存一份,如下图所示:
以上就是初步对面向对象编程的简单认识,在这里感谢武sir在网络教学中的详细讲解以及武sir的博客
http://www.cnblogs.com/wupeiqi/p/4493506.html
本文出自 “crazyforever” 博客,请务必保留此出处http://crazyforever.blog.51cto.com/7362974/1734990
原文:http://crazyforever.blog.51cto.com/7362974/1734990