菜鸟学Python之面向对象

来源:互联网 发布:天津南开网络花店 编辑:程序博客网 时间:2024/06/11 01:12

    在讲解Python面向对象之前,我们先了解一下Python闭包的概念。什么是Python闭包?它是用来做什么的?

    简单说,闭包就是根据不同的配置信息得到不同的结果。没听明白?那么看一下专业的解释:闭包是词法闭包的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开创造它的环境也不例外。即:闭包就是由函数和与其相关的引用环境组合而成的实体。

       还是没懂?没关系(这么官方的语言谁能明白,是吧)。让我来举例说明,这样我们就会明白的很透彻了。

其运行结果为:

       我们发现,make_inf是一个函数,包括一个参数name,比较特殊的地方就是这个函数里边有定义了一个新的函数,这个新的函数里面的一个变量正好是外部make_inf的参数,也就是说,外部传递过来的name已经和inf函数绑定在一起了,形成一个新的函数,我们可以把name看作新函数的一个一个配置信息,配置信息不同,函数的功能就不一样了,也就是能得到定制之后的函数。

       再看看运行结果,因为配置信息不同,p,q在执行相同的参数的函数后得到了不同的结果,这就是闭包。

       通过这个例子,我们可以给闭包一个言简意赅的定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).

       说了这么多,闭包有何用途呢?

       用途1,当闭包执行完后,仍然能够保持住当前的运行环境。

       用途2,闭包可以根据外部作用域的局部变量来得到不同的结果,这有点像一种类似配置功能的作用。

       好了,我们言归正传,开始讲Python面向对象的基本概念:

       1、类是属性相近的对象的归类

       Python通过使用类(class)和对象(object)来实现面向对象的编程(OOP)。

       面向对象编程最主要的目的就是提高程序的重复使用性,这和函数的目的是相似的。

       我们从第二讲就切入Python面向编程的原因是:Python的整个概念是基于对象的。了解OOP对我们深入了解Python非常之关键,让我们由浅入深开始了解Python的面向对象编程:

       在人们的潜意识中,会把属性相近的东西归类,并且给类别命名。比如说人的共同属性都有名字,都会说话。具体到个人都是以人类的原型为基础的。

       面向对象就是模拟了以上人类认知的过程。

       先定义人类:

      

       我们定义了一个类别(person),两个变量:have_name,have_talk。这两个变量对应于刚才所说的属性。

       假设我有一个同学,叫melody,使用前面定义的类:

      

       通过创建对象,并说明melody是类别人中的一个对象,melody就有了人的属性,对属性的引用通过melody.attribute的形式实现。

       2、属性可以是变量,也可以是动作,也称之为方法

       在我们的日常认知中,不仅会通过变量来识别类别,还会根据这个东西能干什么来区分类别,比如说人可以学习,这样就和别的动物区分开来。为了正式一些,我们叫这样的一些属性称为方法,Python中通过在类内部定义函数,来说明方法。

      

       我们重新定义了人这个类别。

       新增了一个方法属性。就是学习,它的参数有一个是self,它是为了方便我们引用对象自身,而且第一个参数必须是self,在任何情况下都要这样,而且这个参数指的就是对象本身,由于对象拥有类的所有性质,那么我们就可以在方法内部通过self来调用类的其它属性。

       3、类别本身还可以进一步细分成为子类

       比如,人类可以按地域进一步划分为中国人和美国人

       在OOP中,我们通过继承来表达上述概念。

      

 

       通过继承制度,我们可以避免程序中的重复信息和重复语句。如果我们定义了两个类,而不继承人类,那么我们就必须把人类的属性分别敲到中国人和美国人类的定义中,麻烦不麻烦,所以,从刚开始就说,面向对象提高了程序的重复使用性。

       在此呢,我顺便说一下面向对象和面向过程的一些区别:

       我们可以看到,面向对象实际上基于人类认知时的习惯,将各种各样的东西分类,从而了解世界。我们从祖先开始可能已经练习了这个认知过程有几百万年,所以面向对象是很符合人类思维习惯的编程方法。所谓面向过程(也就是执行完一个语句再执行下一个)实际上是机器思维。通过面向对象的编程,我们实际上是更贴近我们自然的思维方式,也更方便和其他人交流我们程序里所包含的想法,甚至于那个人并不是程序员。

       下面我们来讲一下类中的一些方法:

       1)__init__()方法:

       __init__()是一个非常之特殊的方法。Python里会有一些特殊的方法,Python会以特别的方式处理它们,特殊方法的名字的特点是前后都有两个下划线。__init__()方法特殊的地方在于,一旦你根据这个类建立对象,Python就会自动调用这个方法(相当于初始函数)。

      

       2)、类方法

       类方法:类方法与普通的成员函数和静态函数有不同之处,在接触的语言中好像也没见过这种语义,看它的定义: 一个类方法就可以通过类或它的实例来调用的方法,不管你是用类来调用这个方法还是类实例调用这个方法,该方法的第一个参数总是定义该方法的类对象。 

类方法的另一个作用就是可以对类属性进行修改:

3)、静态方法

要在类中使用静态方法,需在类成员函数前面加上@staticmethod标记符,以表示下面的成员函数是静态函数。使用静态方法的好处是,不需要定义实例即可使用这个方法。另外,多个实例共享此静态方法。

其结果为:

关于Python的继承和多继承:

1)在Python中,如果父类和子类都重新定义了构造方法__init( )__,在进行子类实例化的时候,子类的构造方法不会自动调用父类的构造方法,必须在子类中显示调用。

class SubClass(SuperClass1)

2)如果需要在子类中调用父类的方法,需要以  父类名.方法  这种方式调用,以这种方式调用的时候,注意要传递self参数过去。

  对于继承关系,子类继承了父类所有的公有属性和方法,可以在子类中通过父类名来调用,而对于私有的属性和方法,子类是不进行继承的,因此在子类中是无法通过父类名来访问的。

  对于多重继承,比如

class SubClass(SuperClass1,SuperClass2)

此时有一个问题就是如果SubClass没有重新定义构造方法,它会自动调用哪个父类的构造方法?这里记住一点:以第一个父类为中心。如果SubClass重新定义了构造方法,需要显示去调用父类的构造方法,此时调用哪个父类的构造方法由你自己决定;若SubClass没有重新定义构造方法,则只会执行第一个父类的构造方法。并且若SuperClass1和SuperClass2中有同名的方法,通过子类的实例化对象去调用该方法时调用的是第一个父类中的方法。

关于Python面向对象编程的继承和多继承,将在下讲详细说明。

0 0