Python从入门到编写POC之初识OOP和类

2020-07-15 6,643

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

Tags:
评论  (0)
快来写下你的想法吧!

i春秋聚集地

文章数:24 积分: 225

i春秋聚集地旨在为信息安全爱好者提供及时有效的信息渠道和体验平台,欢迎关注公众号(icqedu),和“i春秋学院”微博了解更多网络安全新知识~

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号