(七)Python 面向对象的程序设计(类)

  • 1、面向对象的概念

    • 常用的编程方式有两种:面向过程面向对象

    • 面向过程:是早期程序员所使用的方法,首先将问题分解成步骤,然后用函数逐个按次序实现,运行的时候依次调用即可。

    • 面向对象:是指把构成问题的事务分解组合抽象成对象,建立对象的目的不是为了完成其中某个步骤,而是为了描述某个事务在解决整个问题中的行为,可能涉及一个步骤,但通常都会涉及多个步骤,很好地体现了软件重用的思想。Python 在涉及之初就是一门面向对象的语言。

    • 看几个概念

      • 类(class):对具有相同属性和方法的一组对象的描述或定义。
      • 对象(object):类的实例。
      • 实例(Inatance):其含义与对象基本一致。创建一个新对象的过程称为实例化(Instantiation),这个新对象称为这个类的一个实例。
      • 标识(Identity): 每个实例对象的唯一标识。
      • 实例属性(Inatance Attribute): 特定对象所具有的一组属性的集合。
      • 实例方法(Inatance Method): 对于特定对象实例的一条或多条属性的操作函数集合。
      • 类属性(Class Attribute): 属于一个类中所有对象的属性,不会只在某个实例上发生变化。
      • 类方法(Class Method):那些无须指定实例就能够工作的从属于类的函数。
  • 2、类与实例

    • 创建类和子类:类使用class关键字创建,类的属性和方法被列在一个缩进块中。如下:

       #  类
       class animals:
               pass
       # 子类
       class mammals(animals):
               pass
      
    • 用函数表示类的行为特征:为类和子类创建行为特征---函数,如下:

      class animals:
           def breth(self):
               print("呼吸")
      class mammals(animals):
           def move(self):
               print("奔跑")
      class dog(mammals):
           def eat(self):
               print("吃")
      Bob = dog()
      Bob.move()
      Bob.eat()
      运行结果:
      奔跑
      吃
      
  • 3、面向对象的特征

    • Python程序是面向对象的程序,具有三个特征:封装、继承和多态

    • 封装是指将对象得到的数据和行为结合,将基本类结构的细节隐藏起来,通过方法接口实现对实例变量的所有访问。Python中允许对类的数据和方法进行封装,下面的例子封装了类中的数据,将公司名和领导人分别封装到对象objc1和objc2中的self的 companyname 和 leader属性中。

      class Company:
           def __init__(self,companyname,leader):
                 self. companyname = companyname
                 self. leader = leader
      if __name__ == "__main__":
           objc1 = Company("a","Nike")
           objc1 = Company("b","Jack")
      

      在调用数据时,可以使用两种方式:通过对象直接调用和通过self直接调用。例如:

      class Company:
          def __init__(self, companyname, leader):
                self.companyname = companyname
                self.leader = leader
          def show(self):
                print(self.companyname)
                print(self.leader)
      
      if __name__ == "__main__":
          objc1 = Company("a", "Nike")
          objc2 = Company("b", "Jack")
      
      # 通过对象直接调用封装的数据
      print(objc1.companyname)
      print(objc1.leader)
      运行结果为:
      a
      Nike
      
      # 通过self来间接调用,self即对象本身
      objc1.show()
      objc2.show()
      运行结果为:
      a
      Nike
      b
      Jack
      
    • 继承:当已经存在一个类,需要另外再创建一个和已有类型非常相似的类时,通常不必将同一段代码重复多次,而是用继承。在类上添加关联,使得位于不同层次的类可以“继承”位于关系上层的类的属性。继承有利于代码的复用和模块化。和其他语言不同的是,Python 中的类还具有多继承的特性。即一个类可以有多个父类。

      • 继承一个父类: 下面这个例子中,Company类 只有Scale 一个父类。当调用 check()方法时,Company 本身没有定义check()方法,代码就会向上自动检测父类Scale中是否存在check()方法,结果父类中找到了该方法,次为单继承,即只有一个父类。

        class Scale:
            def check(self):
                 if self.count_person > 500:
                      print("%s是个大公司." % self.name)
                 else:
                      print("%s是个小公司." % self.name)
        class Company(Scale):
            def __init__(self,name,count):
                 self.name = name
                 self.count_person = count
        
        if __name__ == "__main__":
           my_company = Company("JK",600)
           my_company.check()
        
      • 继承多个父类:

        class Scale:
             def check(self):
                  if self.count_person > 500:
                       return "%s是个大公司." % self.name
                  else:
                       return "%s是个小公司." % self.name
        class Detail:
             def show(self,scale):
                 print("%s,公司有%s名员工."%(scale,self.count_person))
        
        class Company(Scale,Detail):
            def __init__(self,name,count):
                 self.name = name
                 self.count_person = count
        
        if __name__ == "__main__":
             my_company = Company("JK",600)
             company_scale = my_company.check()
             my_company.show(company_scale)
        结果为:
        JK是个大公司.,公司有600名员工.
        

        在上面的例子中,类Company 分别继承了类Scale和类Detail,可以调用父类中的check和show方法,这种继承的方法称为多继承

    • 多态: 多态即多种姿态,是指在事先不知道对象类型的情况下,可以自动根据对象的不同类型,执行响应的操作。很多内建运算符以及函数、方法都能体现多态的性质。例如:“+”运算符,在连接数值类型变量时表示加法操作,在连接字符串时则表示拼接。例如:函数的多态性举例

      >>> def length(x):
               print(repr(x),"的长度为",len(x))
      >>> print(length('aaa'))
      'aaa' 的长度为 3
      >>> print(length([1,2,4,5,6]))
      [1, 2, 4, 5, 6] 的长度为 5
      

      函数 repr() 返回一个对象的可打印字符串,无须事先知道是什么类型,该函数也表现了Python多态特性。

  • 4、库的安装

    • 4.1、包的管理: Python 程序一般由 包(package)模块(module)函数(function)三部分组成。其中 是一系列模块组成的集合,模块是处理某类问题的函数和类的集合。一个包可以包含多个模块,每个模块可以包含多个函数与类,同时也可以有执行语句,每个包其实就是完成特定任务的工具箱。具体来说,一个.py文件可以被看做是一个独立的模块,一个模块通常就是一个文件,因为模块是按照逻辑组织代码的方法,而文件是物理层存储模块的方式。包是一个可以完整测试的、独立开发的模块组合,通常发布在Python 指定的文件夹里。当多个模块使用同一组模块时,可以将模块封装成包,发布到公共文件里,这就是包的含义。所以说模块对应的物理层结构是文件,那么包对应的物理层结构就是文件夹。包是通过目录结构组织的模块的集合,使用包的方式跟模块类似,可以通过import导入,需要注意的是,当文件夹当做包使用时,文件夹中需要包含一个_init_.py 文件,主要为了避免将包当做普通的文件夹。_init_.py的内容可以为空。

    • 4.2、包管理工具: 有4种,关系如下:

      (七)Python 面向对象的程序设计(类)_第1张图片
      Python包管理

      • distutils: 是 Python 标准库的一部分,为开发者提供一种方便的打开方式,同时也为使用者提供了方便的包安装方式。
      • setuptools: 是对distutils 的增强,引入了包依赖管理。setuptools可以为Python 包创建egg文件。Python 与 egg文件的关系,类似于Java语言与 jar包的关系。setuptools提供的easy_install 脚本可以用来安装 egg 包。
      • easy_install:是由 PEAK (Python Enterprise Application Kit) 开发的setuptools包里带的一个命令,所以使用easy_install实际上是在调用 setuptools 来完成模块的工作。easy_install可以自动从 https://pypi.python.org/pypi 下载相关的包,并完成安装和升级。
      • pip:是安装管理Python 包的标准工具,是对easy_install增强和替代,但它仍有大量的功能建立在setuptools组件之上。同样可以从 PyPI网站自动下载安装包。在pip中,安装所需要的包都需要先下载,并且所有的安装包都会被跟踪,因此避免了出现安装不完整的情况。
    • 4.3、包格式:用于Python 第三方库安装的包格式有以下两种

      • egg: 格式是 setuptools 引入的一种文件格式,使用.egg作为扩展名,用setuptools识别、解析和安装。
      • wheel:本质上是 ZIP的压缩格式,使用 .whl 作为扩展名。
    • 4.4、安装方式: 百度自己搜

  • 5、模块的引用
    应用Python 进行编程时,通常会使用一些库(模块) 来满足开发需求。Python 中库主要分为三大类: 第一类是标准模块,第二类是第三方模块,第三类是自定义模块。无论哪个库使用之前都需要导入。这里一个库可能包含多个模块,但其含义均指 module。

    • 5.1、使用 import 方式导入库
      使用 import 语句导入模块,语法如下:

      import <模块 1>
      import <模块 2>
      

      也可以在一行内导入多个模块(可读性差,不推荐)
      只要导入了某个模块,就可以引用它的所有公共函数、类或者属性。如果 import语句是在代码的顶层,则它的作用域为全局;如果import语句在某个函数中,则它的作用域仅局限于该函数。
      用import模块语句导入模块,就在当前的名称空间(NameSpace) 中建立一个指向该模块的引用,这种引用必须使用全称。也就是说,当使用被导入的模块的函数时,在调用时必须同时包含模块的名字,不能只使用函数名字,而应该使用“模块名.函数名”,例如导入 绘图模块 turtle

      >>> import turtle
      >>> t= turtle.Pen()
      

      若引入的模块名称较长,为方便使用,通常可用 as 定义一个别名。例如,导入 Matplotlib库 pyplot 模块:import Matplotlib as plt ,然后就可以直接用 plt.figure(....) 创建绘图对象,二不必使用 Matplotlib.pyplot.figure(...)。

    • 5.2、from 方式

      将模块中指定的属性或名称导入当前程序命名空间,语法格式如下:

      from <模块名> import <函数名>
      

      例如,导入画图模块 turtle 中的 Pen()函数:

      >>> from  turtle import Pen
      >>> t = Pen()
      

你可能感兴趣的:((七)Python 面向对象的程序设计(类))