首页 > 其他 > 详细

练习40--模块、类和对象

时间:2020-07-28 00:42:04      阅读:80      评论:0      收藏:0      [点我收藏+]

一 模块概念

  • python中有一个非常通用的模式:
    • 1 用一个键=值(key = value)形式的容器
    • 2 通过键的名称从中获取内容
  • 在字典中,键是一个字符串,语法是: [key] 。而在模块中,键是一个识别符,语法是 .key ,
  • 除此之外它们几乎是同一种东西。

1 封装的概念

  • 定义:代码封装,其实就是隐藏实现功能的具体代码,仅留给用户使用的接口,就好像使用计算机,用户只需要使用键盘、鼠标就可以实现一些功能,而根本不需要知道其内部是如何工作的。
  • 类型:
    • 诸多容器,例如列表、元组、字符串、字典等,它们都是对数据的封装;
    • 函数是对 Python 代码的封装;
    • 类是对方法和属性的封装,也可以说是对函数和数据的封装。
    • 模块是对代码更高级的封装,即把能够实现某一特定功能的代码编写在同一个 .py 文件中,并将其作为一个独立的模块,这样既可以方便其它程序或脚本导入并使用,同时还能有效避免函数名和变量名发生冲突。

2 模块

  • 定义:Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。
  • 功能:
    • 模块让你能够有逻辑地组织你的 Python 代码段。
    • 把相关的代码分配到一个模块里能让你的代码更好用,更易懂。
    • 模块能定义函数,类和变量,模块里也能包含可执行的代码。
  • 创建:将所需代码保存在文件扩展名为 .py 的文件中的过程即为创建模块的过程
  • 导入:我们可以通过 import 语句来导入我们创建的模块
    • import 模块名1 [as 别名1], 模块名2 [as 别名2],…
      • 特点:
        • 使用这种语法格式的 import 语句,会导入指定模块中的所有成员(包括变量、函数、类等)
        • 当需要使用模块中的成员时,需用该模块名(或别名)作为前缀,否则 Python 解释器会报错。
      • 常见格式:
        • import 模块名:最简单的语法,导入整个模块
        • import 模块名 as 别名:导入整个模块时,也可以为模块指定别名。
        • import 模块名1,模块名2:一次导入多个模块,多个模块之间用逗号隔开。
        • import 模块名1 as 别名1,模块名2 as 别名2:在导入多个模块的同时,也可以为模块指定别名
    • from import 语句:from 模块名 import 成员名1 [as 别名1],成员名2 [as 别名2],…
      • 特点:
        •  使用这种语法格式的 import 语句,只会导入模块中指定的成员,而不是全部成员。
        • 当程序中使用该成员时,无需附加任何前缀,直接使用成员名(或别名)即可。
      • 常见格式:
        • from 模块名 import 成员名:最简单的语法,导入指定成员
        • from 模块名 import 成员名  as 别名:导入模块成员时,也可以为成员指定别名
        • from 模块名 import 成员名1,成员名2:from...import 导入模块成员时,支持一次导入多个成员
        • from 模块名 import 成员名1 as 别名1,成员名2 as 别名2:一次导入多个模块成员时,也可指定别名,同样使用 as 关键字为成员指定别名
        • from 模块名 import *:一般不推荐使用“from 模块 import *”这种语法导入指定模块内的所有成员,因为它存在潜在的风险。当两个不同模块中出现同名函数时,调用该函数会出现问题
    • reload()函数:
      • 功能:该函数会重新导入之前导入过的模块
      • 语法:reload(module_name)
      • 应用场景:当一个模块被导入到一个脚本,模块顶层部分的代码只会被执行一次。如果想重新执行模块里顶层部分的代码,可以用 reload() 函数
  • 环境变量PYTHONPATH的相关内容:
    • PYTHONPATH变量:环境变量PYTHONPATH 由装在一个列表里的许多目录组成。
    • 模块搜索路径:当你导入一个模块,Python 解析器对模块位置的搜索顺序是:
      • 1、当前目录
      • 2、如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。
      • 3、如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/。
    • 模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
    • 解决“Python找不到指定模块”的方法有 3 种:
      • 1 向 sys.path 中临时添加模块文件存储位置的完整路径;
      • 2 将模块放在 sys.path 变量中已包含的模块加载路径中;
      • 3 设置 path 系统环境变量。
  • 查看成员:
    • dir()函数:查看某指定模块包含的全部成员(包括变量、函数和类),dir(模块名)

      •  

        dir() 函数一个排好序的字符串列表,内容是一个模块里定义过的名字。

      •  

        返回的列表容纳了在一个模块里定义的所有模块,变量和函数
      • 这里所指的全部成员,不仅包含可供我们调用的模块成员,还包含所有名称以双下划线“__”开头和结尾的成员,而这些“特殊”命名的成员,是为了在本模块中使用的,并不希望被其它文件调用。
    • _all_变量:借助该变量也可以查看模块(包)内包含的所有成员。模块名.__all__
      • __all__ 变量在查看指定模块成员时,它不会显示模块中的特殊成员,同时还会根据成员的名称进行排序显示。
      • 并非所有的模块都支持使用 __all__ 变量,因此对于获取有些模块的成员,就只能使用 dir() 函数。
  • 命名空间和作用域:
    • 变量:指的是拥有匹配对象的名字(标识符)
    • 命名空间:是一个包含了变量名称们(键)和它们各自相应的对象们(值)的字典。
      • 局部命名空间:局部变量的作用域
      • 全局命名空间:全局变量的作用域
    • 特点:
      • 一个 Python 表达式可以访问局部命名空间和全局命名空间里的变量。
      • 如果一个局部变量和一个全局变量重名,则局部变量会覆盖全局变量。
      • Python 会智能地猜测一个变量是局部的还是全局的,它假设任何在函数内赋值的变量都是局部的。因此,如果要给函数内的全局变量赋值,必须使用 global 语句。
    • globals()函数和locals()函数
      • 根据调用地方的不同,globals() 和 locals() 函数可被用来返回全局和局部命名空间里的名字。
      • 如果在函数内部调用 locals(),返回的是所有能在该函数里访问的命名。
      • 如果在函数内部调用 globals(),返回的是所有在该函数里能访问的全局名字。
      • 两个函数的返回类型都是字典。所以名字们能用 keys() 函数摘取。

二  类和对象的概念

1 面向对象引子及概念

  •  面向过程:
    • 定义:
      • 按照业务逻辑和实现过程步骤来逐步垒代码,代码编写的逻辑即对应于实际实现的步骤过程,核心是过程两个字,从代码执行顺序上体现出设计者的逻辑过程,整个程序就是把若干个过程串起来的效果。本质上像是构建了一条生成流水线,每一道工序都通过代码块严格定义。
    • 优点:
      • 复杂问题简单化,把大的任务逐步分解成一个一个小的任务分步实现,实现了每个小的步骤即可完成整体任务。逻辑思想符合日常生活中的常规过程化思维,因而代码可读性较高。
    • 缺点:
      • 由于实现逻辑是自上而下的分步过程,任何一个环节的变动,都可能涉及到后续环节的变动,牵一发而动全身。因此代码的灵活性、可维护性较差:构建的生产面包的流水线,如果原料工艺发生变化,很可能要进行生产线的改造;当然想用它来生产饮料,几乎要推倒重来。
    • 应用场景:
      • 需求相对固化,不会经常变更,容易通过过程化思维顺序体现出来的情况。
  • 函数式编程:
    • 定义:
      • 函数式编程也是一种面向过程的编程范式,主要变化在于把重要的功能逻辑通过函数进行封装,以便重复调用,同时也提高了代码的维护性。
    • 缺点:
      • 对于较为复杂的应用场景,遇到多个函数需要传递共同的参数时,代码量较大且比较繁杂。
  • 面向对象:
    • 定义:
      • 面向对象是一个抽象归类的思维过程,先梳理出具有共同属性的个体对象,然后对他们抽象归类。这样整个编程的设计思想不再是面向过程中的自上而下的串联顺序关系,而变成一种属于和不属于,具有或者不具有(某种属性)的关系。
    • 优点:
      • 对于复杂的场景,功能实现的灵活性更好,换言之适配性和扩展性更好。
    • 缺点:
      • 面向对象是一个抽象的过程,不同于面向对象的流水线式顺序执行过程,编程的复杂程度更高,首要前提是要梳理出对象之间的关系,归类出相应的属性,对于开发者而言要求更高,需具备一定的储备之后才能胜任一般场景的编程开发。
    • 应用场景:
      • 需求经常变化且相对复杂的软件,一般需求的变化都集中在用户层,互联网应用,游戏等都是面向对象的程序设计大显身手的好地方。
  • 面向对象常用术语:
    • 例子:
    •  1 class tortoise:
       2     bodyColor = "绿色"
       3     footNum = 4
       4     weight = 10
       5     hasShell = True
       6 
       7     #会爬
       8     def crawl(self):
       9         print("乌龟会爬")
      10     #会吃东西
      11     def eat(self):
      12         print("乌龟吃东西")
      13     #会睡觉
      14     def sleep(self):
      15         print("乌龟在睡觉")
      16     #会缩到壳里
      17     def protect(self):
      18         print("乌龟缩进了壳里")
    • 类:
      • 可以理解是一个模板,通过它可以创建出无数个具体实例。比如,前面编写的 tortoise 表示的只是乌龟这个物种,通过它可以创建出无数个实例来代表各种不同特征的乌龟(这一过程又称为类的实例化)。
    • 对象:
      • 类并不能直接使用,通过类创建出的实例(又称对象)才能使用。这有点像汽车图纸和汽车的关系,图纸本身(类)并不能为人们使用,通过图纸创建出的一辆辆车(对象)才能使用。
    • 属性:
      • 类中的所有变量称为属性。例如,tortoise 这个类中,bodyColor、footNum、weight、hasShell 都是这个类拥有的属性。
    • 方法:
      • 类中的所有函数通常称为方法。不过,和函数所有不同的是,类方法至少要包含一个 self 参数(后续会做详细介绍)。例如,tortoise 类中,crawl()、eat()、sleep()、protect() 都是这个类所拥有的方法,类方法无法单独使用,只能和类的对象一起使用。

参考内容:

https://www.runoob.com/python/python-object.html

https://www.cnblogs.com/linupython/p/9388610.html

http://c.biancheng.net/view/4512.html

练习40--模块、类和对象

原文:https://www.cnblogs.com/luoxun/p/13383993.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!