干货分享丨Python从入门到编写POC之初识OOP和类
Python从入门到编写POC系列文章是i春秋论坛作家「Exp1ore」表哥原创的一套完整教程,想系统学习Python技能的小伙伴,不要错过哦!
1、初识OOP和类
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。
而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。
在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。
类(Class)是面向对象程序设计(OOP,Object-Oriented Programming)实现信息封装的基础。类是一种用户定义类型,也称类类型。每个类包含数据说明和一组操作数据或传递消息的函数。类的实例称为对象。
2、新式类与旧式类
先看一下二者的区别,首先是旧式类,旧式类又称为经典类。
>>> class demo1: pass
这样就定义了一个很简单的旧式类,将它实例化:
>>> DEMO1 = demo1()
>>> type(demo1) <type 'classobj'> >>> DEMO1.__class__<class __main__.demo1 at 0x036FEDF8>>>> type(DEMO1)<type 'instance'>
有人可能会问DEMO1.__class__是什么意思?
DEMO1是一个instance(实例),也是一个对象,而每个对象都有一个__class__属性,用来显示它的类型,到了Python2.2以后,就有了新式类。
>>> class DEMO2(object): pass>>> demo2 = DEMO2()>>> demo2.__class__<class '__main__.DEMO2'>>>> type(demo2)<class '__main__.DEMO2'>
由此,新式类与旧式类的区别:
(1)旧式类,.__class__和type( )的类型不同,但是新式类是相同的;
(2)新式类要在类的名字后面跟上(object),这是一个继承的类的操作,也是基本操作。
3、定义类
定义新式类的方法
第一种方法:
>>> class demo(object): pass
第二种方法:
>>> __metaclass__ = type>>> class DEMO: pass
4、创建类
写一个简单的例子:
#coding = utf-8__metaclass__ = typeclass students: def __init__(self,name): self.name = name
声明建立了一个名为“students”的类,用缩进表示这个类的内容,有些人也会把类里面的函数叫做“方法”。
PS:类中的函数的参数必须包括self参数,且默认作为第一个参数,继续深入,def __init__是一个特殊的函数,叫做构造函数(初始化函数)。
这样就意味着实例化时要给参数name提供一个值,作为类的初始化内容,同时,要通过name参数传一个值,成为类和实例的一个属性。
>>> demo = students('BaZong')>>> print demo.nameBaZong
这样就确定了这个类的基本属性,加深理解一下:
# -*- coding: UTF-8 -*-__metaclass__ = typeclass students: def __init__(self,name): self.name = name def Name(self): return self.namestudent = students('MOMO') #将它实例化name = student.Name() #调用函数print 'This student is my goddess ------',nameprint student.name #实例的属性
运行一下:
为何self有时必须用,有时却不需要?
其实,self不用非得写成self,写成其它的也可以,这只是约定俗称吧。
总而言之:
(2)self的名字并不是规定死的,但是最好还是按照约定是用self;
(3)self总是指调用时的类的实例。
5、继承
“继承”是面向对象软件技术当中的一个概念。如果一个类A继承自另一个类B,就把这个A称为"B的子类",而把B称为"A的父类"。继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。
在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能。另外,为子类追加新的属性和方法也是常见的做法。
先举一个简单例子:
# -*- coding: UTF-8 -*-__metaclass__ = typeclass students: def speak(self): print "Hello momo" def height(self): print "MOMO's height is 1.70m"class goddess(students): def height(self): print "MOMO's height is 1.80m"if __name__ == '__main__': demo = goddess() demo.height() demo.speak()
这就是继承。有个小疑问,为啥是1.80m不是1.7m呢?
因为继承了students,所以goddess这个类就有了students的所有函数(方法)和属性,但是如果有同样的名称方法(函数),那么就会显示goddess中的方法,这叫做方法重写。