鱼C论坛

 找回密码
 立即注册

课后作业050讲

已有 334 次阅读2019-12-6 15:29 |个人分类:课后作业

测试题(笔试,不能上机哦~):
0. 说到底,Python 的模块是什么?
答:模块就是程序,单独存放的程序
1. 我们现在有一个 hello.py 的文件,里边有一个 hi() 函数:
  1. def hi():
  2.     print("Hi everyone, I love FishC.com!")
请问我如何在另外一个源文件 test.py 里边使用 hello.py 的 hi() 函数呢?
答:
import hello
hello.hi()

2. 你知道的总共有几种导入模块的方法?
答:3种
3. 曾经我们讲过有办法阻止 from…import * 导入你的“私隐”属性,你还记得是怎么做的吗?
答:__双下划线
4. 倘若有 a.py 和 b.py 两个文件,内容如下:
  1. # a.py
  2. def sayHi():
  3.     print("嗨,我是 A 模块~")

  4. # b.py
  5. def sayHi():
  6.     print("嗨,我是 B 模块~")

那么我在 test.py 文件中执行以下操作,会打印什么结果?
  1. # test.py
  2. from a import sayHi
  3. from b import sayHi

  4. sayHi()
复制代码
答:会报错,命名空间混乱了。

5. 执行下边 a.py 或 b.py 任何一个文件,都会报错,请尝试解释一下此现象。
  1. # a.py
  2. from b import y
  3. def x():
  4.     print('x')

  5. # b.py
  6. from a import x
  7. def y():
  8.     print('y')

  9. >>> 
  10. Traceback (most recent call last):
  11.   File "/Users/FishC/Desktop/a.py", line 1, in <module>
  12.     from b import x
  13.   File "/Users/FishC/Desktop/b.py", line 1, in <module>
  14.     import a
  15.   File "/Users/FishC/Desktop/a.py", line 1, in <module>
  16.     from b import x
  17. ImportError: cannot import name 'x'
答:命名混乱了

动动手(一定要自己动手试试哦~):
0. 问大家一个问题:Python 支持常量吗?相信很多鱼油的答案都是否定的,但实际上 Python 内建的命名空间是支持一小部分常量的,比如我们熟悉的 True,False,None 等,只是 Python 没有提供定义常量的直接方式而已。那么这一题的要求是创建一个 const 模块,功能是让 Python 支持常量。

说到这里大家可能还是一头雾水,没关系,我们举个栗子。
  1. # const 模块就是这道题要求我们自己写的
  2. # const 模块用于让 Python 支持常量操作
  3. import const

  4. const.NAME = "FishC"
  5. print(const.NAME)

  6. try:
  7.     # 尝试修改常量
  8.     const.NAME = "FishC.com"
  9. except TypeError as Err:
  10.     print(Err)

  11. try:
  12.     # 变量名需要大写
  13.     const.name = "FishC"
  14. except TypeError as Err:
  15.     print(Err)
复制代码

执行后的结果是:
  1. >>> 
  2. FishC
  3. 常量无法改变!
  4. 常量名必须由大写字母组成!
复制代码

在 const 模块中我们到底做了什么,使得这个模块这么有“魔力”呢?大家跟着小甲鱼的提示,一步步来做你就懂了:
  • 提示一:我们需要一个 Const 类
  • 提示二:重写 Const 类的某一个魔法方法,指定当实例对象的属性被修改时的行为
  • 提示三:检查该属性是否已存在
  • 提示四:检查该属性的名字是否为大写
  • 提示五:细心的鱼油可能发现了,怎么我们这个 const 模块导入之后就把它当对象来使用(const.NAME = "FishC")了呢?难道模块也可以是一个对象?没错啦,在 Python 中无处不对象,到处都是你的对象。使用以下方法可以将你的模块与类 A 的对象挂钩。

  1. '''
  2. sys.modules 是一个字典,它包含了从 Python 开始运行起,被导入的所有模块。键就是模块名,值就是模块对象。
  3. '''
  4. import sys
  5. sys.modules[__name__] = A()
复制代码


本讲总结:
1.命名冲突的时候,后命名的会覆盖前面的。
2.注意这个是循环嵌套导入问题
3.python 中预置的__dict__属性,是保存类实例或对象实例的属性变量键值对字典
4.sys.modules的用法

路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-22 03:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部