Python面向对象编程,封装,继承,多态

一   面向对象编程

     面向对象是一种新兴的程序设计方法,或者说它是一种新的程序设计范型,其基本思想是使用对象,类,继承,封装,消息等基本概念来进行程序设计。
     它是从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域(现实世界)中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位(而不是用一些与现实世界中的事物相关比较远,并且没有对应关系的其它概念来构造系统)。这可以使系统直接地映射问题域,保持问题域中事物及其相互关系的本来面貌。

1. 面向对象编程中类的设计

      在程序设计中,要设计一个类,通常要满足下面三个要求:

       1  类名:这类事物的名字,满足大驼峰命名法

       2  属性:这类事物具有什么样的特征

       3  方法:这类事物具有什么样的行为

2. 类定义的格式

      类的定义通常使用class关键字来声明这是一个类,用def关键字来声明这是类中的一个方法。

     格式:

      class   类名:

               def 方法1(self,参数列表):

                       pass

               def  方法2(self,参数列表):

                       pass

      当一个类定义完成之后,要使用这个类来创建对象,语法格式为:  对象变量=类名()

      简单举例:定义一个Study类,包含两个方法learn和practice,分别执行不同的效果:

     使用对象变量=类名()的格式来创建对象,使用对象变量.方法名的格式来调用类中的方法,输出结果为:

   这样就完成了对于一个简单类和方法的定义,并建立对象和使用类的方法。

3.  关于定义方法时使用到的self:

     哪一个对象调用的方法,self就是哪一个对象的引用。

   输出结果:self指向的是对象的内存地址

4.  定义类时的方法:

    初始化方法:

    当使用类名创建对象时,python的解释器会自动执行以下操作:

           1. 为对象在内存中分配空间----创建对象

           2. 调用初始化方法为对象的属性设置初始值----初始化方法(__init__方法)。__init__方法是对象的内置方法,专门用来定义一个类具有哪些属性

    举例:定义初始化方法,初始化方法中定义了几个属性,在用类创建对象的时候,就需要传入几个属性值。此处初始化方法只定义了一个属性值add_name,所以在建立对象的时候,需要传入这个属性的值。

   初始化方法定义之后的输出结果:

__del__方法:

    在python中,为对象分配完空间之后,自动调用__init__方法,当一个对象从内存中销毁之前,会自动调用__del__方法。

   

最后自动调用del方法,del方法的会在最后执行。输出结果:

提前调用del方法:

提前调用del方法,del方法将在调用时执行。输出结果:

__str__方法:

  如果在开发中,希望使用print输出对象变量时,能够打印自定义内容,就可以使用__str__这个方法了。简单地来说,__str__方法就是一种对输出的自定义描述。

  举例:在类A中定义一个__str__方法,这个方法必须返回的是一个字符:

输出结果:

二  封装

1. 封装的一些相关概念和简单举例:

    封装是面向对象编程的一大特点

    面向对象编程的第一步,就是将属性和方法封装到一个抽象的类中

    外界使用类创建对象,然后让对象调用方法

    对象方法的细节都被封装在类的内部

举例:定义一个类,并定义方法,实现功能:某某每次跑步会减重0.5公斤,吃东西会增加1公斤:

输出结果:

2.  封装的应用举例一:摆放家具

   应用需求:

      1  房子有户型,总面积和家具名称列表,新房子没有任何的家具

      2  家具有名字和占地面积

      3  将家具添加到房子中

      4  输出十,要求输出:户型,总面积,剩余面积,家具名称列表

  设计:

      分别定义两个类,家具类和房子类:

   

输出结果:  当所有的家具占地面积小于房子面积时,正常输出:

    当添加家具后剩余面积不足时,显示提示信息:

封装的应用举例二:士兵开枪

  应用需求:

 1  士兵有一把抢,士兵姓名和枪类型自定义

2   士兵可以开火

3   枪能够发射子弹

4   枪能够装填子弹

设计:定义枪类和士兵类

输出结果:

士兵有枪时,开火射击:

把将枪给士兵的一行代码注释掉,即士兵没有枪:

输出士兵没有枪的结果:

三  继承

    继承:实现代码的重用,相同的代码不需要重复编写。继承父类方法的子类可以调用父类的方法。

   在定义子类时,在子类名后面的括号里写上父类的名称,表示这个子类继承父类的方法。

  1.   举例:定义一副上联的父类与子类:

输出结果:

2.   继承的扩展:

   对于子类继承父类的方法,在使用时如果有必要可以进行对父类方法的扩展。具体的应用形式为在子类定义的方法中,调用父类的方法,并将想要扩展的功能一起写入这个子类的方法中。这样子类方法在调用时,输出的结果就是子类方法和父类方法共同作用出的结果。以以下代码为例,在调用父类SmallFish的aeat方法时,在其输出结果前面加上一句“大鱼吃小鱼”:

输出结果:

3.  继承的覆盖(重写)

    在子类继承父类的方法时,如果不需要父类的某个方法而想重新定义一个心新的方法,可以进行父类方法的重写。具体的应用形式为,在子类的定义方法中,定义一个与想要覆盖的父类方法同名的方法,这样在调用这个方法时,新的方法会将父类的方法覆盖掉,父类方法在调用时失去其本身的职能。以以下代码为例,在子类SmassFish中定义一个与父类Shrimp同名的eat方法,将原来方法的输出结果“虾吃水”覆盖为“小鱼说我不想吃虾了我想吃大鱼”

    

输出结果:

4.   关于两个类中都含有初始化定义的继承:

    如果两个类中都含有初始化定义的方法,那么在继承时就需要在定义子类方法时,以调用的形式首先执行父类的初始化方法,否则在调用时是会因为初始化方法没有特定的指向而报错.

输出结果:

5.  一个子类继承多个父类时,多个父类中同名方法的调用情况:

      如果一个子类同时继承多个父类的方法,而这些父类又含有同名方法,那么子类在调用这些同名方法时,调用的结果将由继承的父类的先后顺序决定,后继承的父类的方法将被覆盖而失去作用。

     举例:子类Third同时继承父类First和Second,两个父类中含有同名方法A:

   在调用父类的A方法时,默认调用的是第一个继承的父类的A方法,即输出“我才First类被继承”:

当子类继承的父类顺序交换时:

调用父类的同名方法时,输出结果还是决定于第一个继承的父类方法:

6   继承的新式类和旧式类

   继承的新式类和旧式类是不同Python版本的不同定义方式,区别在于新式类在定义时类名后面加上一个object,在使用dir指令进行对象的操作时,输出的结果不同,即新式类多了一些新的方法

输出结果:新式类有较多的方法:

四  多态

   多态:不同的子类调用相同的方法,产生不同的执行结果

   将父类的输出结果以形参的方式传入到子类(此处这个形参在子类Fish中表现为aaa),父类中含有同名的方法,在子类中调用这个同名的方法。这样当子类形参传入的实参来自不同的父类时,子类中调用的同名父类方法将产生不同的输出结果。

举例:父类同名方法eat,子类方法形参aaa:

输出结果:

将形参aaa传入的实参值bbb修改为另一个父类的输出:

执行结果发生改变:

猜你喜欢

转载自blog.csdn.net/letter_A/article/details/81173810