Python黑帽编程2.9 面向对象编程

简介:

Python黑帽编程2.9 面向对象编程

我个人认为,计算机语言的发展,有两个方向,一个是从低到高的发展过程,在这个过程中,语言的思考和解决问题的方式是面向硬件的。硬件本质上处理的是信号,在此基础上,我们给硬件赋予了一定的“逻辑思维”能力,为了方便硬件帮我们做事,抽象出了指令的概念,进而出现了汇编语言,然后有了PascalC这样的标准的结构化语言。语言一路向上发展,都是根植于指令的,根植于指令就意味着流程和数据代表了一切,数据的变化成为我们表达和抽象这个世界的根本。不可否认,宇宙间的一切,都是在不停的变化中,然而命运有数,变化有法,越是着眼于变化,我们越难逃脱宿命。

在冯诺依曼的体系成为权威之前或者之后这些年中,计算机科学思考都衍生于对数学的思考。数学家认为数学语言能完美的描述这个世界,基于数学的编程语言一出来就是贵族,然而纯粹数学语言是没法用的,因为我们的机器还太低级,于是另一个编程语言的发展方向,是从数学语言向机器语言的自顶向下的发展。这其中纯粹的函数式语言是这方面的代表,比如lisp,微软的F#则是“混血”的代表。

从机器的角度理解世界,还是纯数学的方式理解世界,都不能代表人的视角和思维方式。在二者相向发展中,有了很多交汇。计算机当然离理解人的思维方式还差的很远,除非把人变成计算单元。科学家们在这个方向上努力良久,在编程语言领域面向对象的思想和方法被广泛接受。事物是不断变化的,人类在变化中寻找相对静止的时空来思考世界,来描述世界,文字、绘画都是语言,都需要在静止中呈现。生命尊重并表现自我,认同个体,于是世间有了物的概念。在静止中,如果还只是思考数据,那么就是混沌,观察个体才有意义,才有血肉。世间万物,物就是对象。

所谓面向对象,就是把你眼中能认为或抽象出的独立事务描述清楚,首先它是个整体,然后我们再肢解它,最后在把它重新放到变化中观察行为。抽象的越彻底,我们越能发现很多事务的共性,于是有了分类。在变化中,物与物必然会产出影响,于是有了关系。

视角发生了变化,描述事物和行为的方式必然有了变化,产生了新的表达方法,新的技巧,同时也有了新的问题和挑战,当然会产生新的解决问题的方法,这些就是面向对象的基本方法,设计模式,架构经验,等等。

扯了这么多闲篇,下面我们进入Python的面向对象世界,当然不会细致入微,简单概述为主。

2.9.1  类与对象

python中,我们使用class关键字来定义一类事物,类是一个抽象描述,并不是真正的存在,需要把它初始化才会产生一个真正的事物,我们称之为对象。在编程过程中,拥有行为和数据的是对象,而不是类。

下面我们声明一个简单的类:

#!/usr/bin/python

 

class Person:

    pass # An empty block

 

p = Person()

print p

我们使用class语句后跟类名,创建了一个新的类。这后面跟着一个缩进的语句块形成类体。在这个例子中,我们使用了一个空白块,它由pass语句表示。

接下来,我们使用类名后跟一对圆括号来创建一个对象/实例。为了验证,我们简单地打印了这个变量的类型。它告诉我们我们已经在__main__模块中有了一个Person类的实例。结果如下:

2

你可能已经注意到存储对象的计算机内存地址也打印了出来。这个地址在你的计算机上会是另外一个值,因为Python可以在任何空位存储对象。

2.9.2 对象的方法

方法代表现实世界中的行为,简单示例如下:

class Person:

    def sayHi(self):

        print 'Hello, how are you?'

 

p = Person()

p.sayHi()

这里我们需要注意sayHi方法没有任何参数,但仍然在函数定义时有selfself代表对象本身,等价于C++中的self指针和JavaC#中的this引用。之后,我们通过对象名加点的方式来调用对象的方法。运行结果如下:

3

2.9.3 构造函数

我们在使用类来构造一个对象的时候,通常在构造支出需要把对象本身的关键属性进行初始化。比如初始化一个人,如果我们认为年龄和名字是关键属性的话,我们在实例化这个人的时候,需要把相关属性的值传进来。上面我们知道出事化对象的时候是类名加括号的方式,实际上这个括号调用了一个内置的方法,我们称之为构造函数,正是该函数返回了被初始化的对象本身。

python的构造函数名为__init__,我们可以自定义传入参数的类型和个数。

#!/usr/bin/python

 

class Person:

    def __init__(self, name):

        self.name = name

    def sayHi(self):

        print 'Hello, my name is', self.name

 

p = Person('Swaroop')

p.sayHi()

这里,我们把__init__方法定义为取一个参数name(以及普通的参数self)。在这个__init__里,我们只是创建一个新的字段 name。最重要的是,我们没有专门调用__init__方法,只是在创建一个类的新实例的时候,把参数包括在圆括号内跟在类名后面,从而传递给__init__方法。

现在,我们能够在我们的方法中使用self.name变量。这在sayHi方法中得到了验证。

4

2.9.4 变量

变量代表属性和数据。在python中变量有两种,类变量和对象变量。类变量是全局的,对每个对象都共享,对象的变量是实例化的,每个对象之间互不影响。下面我们通过一段代码来对比:

#!/usr/bin/python

 

class Person:

    '''Represents a person.'''

    population = 0

 

    def __init__(self, name):

        '''Initializes the person's data.'''

        self.name = name

        print '(Initializing %s)' % self.name

 

        # When this person is created, he/she

        # adds to the population

        Person.population += 1

 

    def __del__(self):

        '''I am dying.'''

        print '%s says bye.' % self.name

 

        Person.population -= 1

 

        if Person.population == 0:

            print 'I am the last one.'

        else:

            print 'There are still %d people left.' % Person.population

 

    def sayHi(self):

        '''Greeting by the person.

 

        Really, that's all it does.'''

        print 'Hi, my name is %s.' % self.name

 

    def howMany(self):

        '''Prints the current population.'''

        if Person.population == 1:

            print 'I am the only person here.'

        else:

            print 'We have %d persons here.' % Person.population

 

swaroop = Person('Swaroop')

swaroop.sayHi()

swaroop.howMany()

 

kalam = Person('Abdul Kalam')

kalam.sayHi()

kalam.howMany()

 

swaroop.sayHi()

swaroop.howMany()

这个例子略微有点长,但是它有助于说明类与对象的变量的本质。这里,population属于Person类,因此是一个类的变量。name变量属于对象(它使用self赋值)因此是对象的变量。

观察可以发现__init__方法用一个名字来初始化Person实例。在这个方法中,我们让population增加1,这是因为我们增加了一个人。同样可以发现,self.name的值根据每个对象指定,这表明了它作为对象的变量的本质。

在这个程序中,我们还看到docstring对于类和方法同样有用。我们可以在运行时使用Person.__doc__Person.sayHi.__doc__来分别访问类与方法的文档字符串。

就如同__init__方法一样,还有一个特殊的方法__del__,它在对象消逝的时候被调用。对象消逝即对象不再被使用,它所占用的内存将返回给系统作它用。在这个方法里面,我们只是简单地把Person.population1

当对象不再被使用时,__del__方法运行,但是很难保证这个方法究竟在 什么时候 运行。如果你想要指明它的运行,你就得使用del语句,就如同我们在以前的例子中使用的那样。

这里需要注意的是:

l  Python中所有的类成员(包括数据成员)默认都是公有的。

l  如果你使用的数据成员名称以 双下划线前缀 比如__privatevarPython的名称管理体系会有效地把它作为私有变量。

l  这样就有一个惯例,如果某个变量只想在类或对象中使用,就应该以单下划线前缀。而其他的名称都将作为公共的,可以被其他类/对象使用。记住这只是一个惯例,并不是Python所要求的(与双下划线前缀不同)。

l  同样,注意__del__方法与其他语言中析构函数的概念类似。

2.9.5 继承

继承这个概念,经常以父与子的关系来被阐述,我认为这阐述对初学者来说是一种误导。在人类社会中,父与子继承的是什么?是财产,实际是赠予。面向对象的继承,实际是不是从现实世界中来,而是为了解决面向对象编程的问题二产生的,要解决的是代码复用的问题。比如人类有许多共性,有鼻子,有眼睛。但是人类也是分亚种的,从肤色上划分人种,地理上划分人群。那么在定义黄种人和黑种人的时候,不可避免的要重新定义很多属性和行为,于是有了继承的概念,把公共的内容放到Person类里面,然后AsiaPerson 继承Person类,它自然就有了Person类定义的内容,这种思想,其实换个词可能更好理解——克隆。概念就不纠结了,理解就好,下面看代码:

#!/usr/bin/python

class SchoolMember:

    '''Represents any school member.'''

    def __init__(self, name, age):

        self.name = name

        self.age = age

        print '(Initialized SchoolMember: %s)' % self.name

 

    def tell(self):

        '''Tell my details.'''

        print 'Name:"%s" Age:"%s"' % (self.name, self.age),

 

class Teacher(SchoolMember):

    '''Represents a teacher.'''

    def __init__(self, name, age, salary):

        SchoolMember.__init__(self, name, age)

        self.salary = salary

        print '(Initialized Teacher: %s)' % self.name

 

    def tell(self):

        SchoolMember.tell(self)

        print 'Salary: "%d"' % self.salary

 

class Student(SchoolMember):

    '''Represents a student.'''

    def __init__(self, name, age, marks):

        SchoolMember.__init__(self, name, age)

        self.marks = marks

        print '(Initialized Student: %s)' % self.name

 

    def tell(self):

        SchoolMember.tell(self)

        print 'Marks: "%d"' % self.marks

 

t = Teacher('Mrs. Shrividya', 40, 30000)

s = Student('Swaroop', 22, 75)

 

print # prints a blank line

 

members = [t, s]

for member in members:

    member.tell() # works for both Teachers and Students

为了使用继承,我们把基类的名称作为一个元组跟在定义类时的类名称之后。然后,我们注意到基类的__init__方法专门使用self变量调用,这样我们就可以初始化对象的基类部分。这一点十分重要——Python不会自动调用基类的构造函数。调用基类的构造函数需要使用基类名进行调用,而且传入子类的self

注意,在我们使用SchoolMember类的tell方法的时候,我们把TeacherStudent的实例仅仅作为SchoolMember的实例。

另外,在这个例子中,我们调用了子类型的tell方法,而不是SchoolMember类的tell方法。可以这样来理解,Python总是首先查找对应类型的方法,在这个例子中就是如此。如果它不能在导出类中找到对应的方法,它才开始到基本类中逐个查找。

python支持多继承,可以同时继承多个基类。

 

2.9.6 小结

Python是一个高度面向对象的语言,我们只是过了一些基本概念,万物皆对象的理念,也让高级的python编程变得更加有趣。

下一节开始,我们进入黑帽编程的阶段,先来讨论主机到网络层典型攻击。

3.0节《网络接口层攻击基础知识》已经在微信订阅号抢先发布,心急的同学进入订阅号(二维码在下方),从菜单网络安全”—>”Python黑帽编程进入即可。

 

查看完整系列教程,请关注我的微信订阅号(xuanhun521,下方二维码),回复“python”。问题讨论请加qq群:Hacking 1群):303242737   Hacking 2群):147098303

 

 


本文转自玄魂博客园博客,原文链接:http://www.cnblogs.com/xuanhun/p/5776586.html,如需转载请自行联系原作者

目录
相关文章
|
17天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
16天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
4天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
98 80
|
3天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
17 2
|
16天前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
41 10
|
18天前
|
机器学习/深度学习 人工智能 数据挖掘
探索Python编程的奥秘
在数字世界的海洋中,Python如同一艘灵活的帆船,引领着无数探险者穿梭于数据的波涛之中。本文将带你领略Python编程的魅力,从基础语法到实际应用,一步步揭开Python的神秘面纱。
37 12
|
17天前
|
IDE 程序员 开发工具
Python编程入门:打造你的第一个程序
迈出编程的第一步,就像在未知的海洋中航行。本文是你启航的指南针,带你了解Python这门语言的魅力所在,并手把手教你构建第一个属于自己的程序。从安装环境到编写代码,我们将一步步走过这段旅程。准备好了吗?让我们开始吧!
|
18天前
|
关系型数据库 开发者 Python
Python编程中的面向对象设计原则####
在本文中,我们将探讨Python编程中的面向对象设计原则。面向对象编程(OOP)是一种通过使用“对象”和“类”的概念来组织代码的方法。我们将介绍SOLID原则,包括单一职责原则、开放/封闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则有助于提高代码的可读性、可维护性和可扩展性。 ####
|
16天前
|
人工智能 数据挖掘 开发者
探索Python编程之美:从基础到进阶
本文是一篇深入浅出的Python编程指南,旨在帮助初学者理解Python编程的核心概念,并引导他们逐步掌握更高级的技术。文章不仅涵盖了Python的基础语法,还深入探讨了面向对象编程、函数式编程等高级主题。通过丰富的代码示例和实践项目,读者将能够巩固所学知识,提升编程技能。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考和启示。让我们一起踏上Python编程的美妙旅程吧!
|
19天前
|
机器学习/深度学习 人工智能 自然语言处理
探索未来编程:Python在人工智能领域的深度应用与前景###
本文将深入探讨Python语言在人工智能(AI)领域的广泛应用,从基础原理到前沿实践,揭示其如何成为推动AI技术创新的关键力量。通过分析Python的简洁性、灵活性以及丰富的库支持,展现其在机器学习、深度学习、自然语言处理等子领域的卓越贡献,并展望Python在未来AI发展中的核心地位与潜在变革。 ###
下一篇
DataWorks