Python从入门到编写POC之初识OOP和类
2020-07-15 17:31:49 Author: www.secpulse.com(查看原文) 阅读量:429 收藏

Python从入门到编写POC系列文章是i春秋论坛作家「Exp1ore」表哥原创的一套完整教程,想系统学习Python技能的小伙伴,不要错过哦!

7a0df270c6be4277a9d70fe8674e80f1.jpg

1、初识OOP和类

面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。

面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。

而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。

在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。

7ab3dc6c86794b608c6b707a71cda42b.gif

类(Class)是面向对象程序设计(OOP,Object-Oriented Programming)实现信息封装的基础。类是一种用户定义类型,也称类类型。每个类包含数据说明和一组操作数据或传递消息的函数。类的实例称为对象。

2、新式类与旧式类

先看一下二者的区别,首先是旧式类,旧式类又称为经典类。

>>> class demo1:
    pass

这样就定义了一个很简单的旧式类,将它实例化:

>>> DEMO1 = demo1()
看下type:
>>> 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__ = type

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

声明建立了一个名为“students”的类,用缩进表示这个类的内容,有些人也会把类里面的函数叫做“方法”。

PS:类中的函数的参数必须包括self参数,且默认作为第一个参数,继续深入,def __init__是一个特殊的函数,叫做构造函数(初始化函数)。

这样就意味着实例化时要给参数name提供一个值,作为类的初始化内容,同时,要通过name参数传一个值,成为类和实例的一个属性。

>>> demo = students('BaZong')
>>> print demo.name
BaZong

a7fa5276ba8647318fb40688023aab46.jpg

这样就确定了这个类的基本属性,加深理解一下:

# -*- coding: UTF-8 -*-
__metaclass__ = type
class students:    def __init__(self,name):        self.name = name    def Name(self):        return self.name
student = students('MOMO')  #将它实例化name = student.Name()  #调用函数print 'This student is my goddess ------',nameprint student.name #实例的属性

运行一下:

262e11b2f5d34f809121e86987ca42ea.jpg

为何self有时必须用,有时却不需要?

其实,self不用非得写成self,写成其它的也可以,这只是约定俗称吧。

总而言之:

(2)self的名字并不是规定死的,但是最好还是按照约定是用self;

(3)self总是指调用时的类的实例。

5、继承

“继承”是面向对象软件技术当中的一个概念。如果一个类A继承自另一个类B,就把这个A称为"B的子类",而把B称为"A的父类"。继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。

在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能。另外,为子类追加新的属性和方法也是常见的做法。

先举一个简单例子:

# -*- coding: UTF-8 -*-
__metaclass__ = type
class 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()

41b49c9f3d7346d387b4ecbb8f01a235.jpg

这就是继承。有个小疑问,为啥是1.80m不是1.7m呢?

因为继承了students,所以goddess这个类就有了students的所有函数(方法)和属性,但是如果有同样的名称方法(函数),那么就会显示goddess中的方法,这叫做方法重写。

本文作者:i春秋聚集地

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/135324.html


文章来源: https://www.secpulse.com/archives/135324.html
如有侵权请联系:admin#unsafe.sh