开发者学堂课程【Python 入门 2020年版:自定义模块的使用】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10363
自定义模块的使用
1.定义
一个模块本质上就是一个 py 文件
自己定义一个模块,其实就是自己写一个 py 文件
2.规则
(1) .举例为 Import 04- 我的模块 如果一个 py 文件想要当作一个模块,这个文件名一定要遵守命名规则。
(2) .规则是,由数字,字母下划线组成,不能以数字开头。注意,只有严格遵守这些规则才可以被导入,其他一概不可。
由此可看,04- 我的模块是不可以的,这时可以自己写一个,举例,命名为,my moudule。
3.导入模块
导入了一个模块,就能使用这个模块里的变量和函数
(1) .Import my_moudule
举例:
比如 my_moudule 里有一个变量,
a=‘hello’
有一个函数是 def test():
print(‘我是 my_moudule 模块里的 test方法’)
验证一下,Print(‘my_moudule.a’)运行的结果就是 hello
my_moudule.test() 运行之后的可过就是我是 my_moudule 模块里的 test方法
(2).from demo import*
举例:
比如设为 demo
定义为 m=‘yes’
n=100
def test():
print(‘我是 demo 模块里的 test 方法’)
def foo():
Print(‘我是 demo 模块里的 foo 方法’)
(3).Import my_moudule 和 from demo import* 没有太大的区别。但是也是有区别的,区别在于,Import my_moudule 导入了模块,要用模块名.变量名。比如 print(my_moudule.a)。
还有模块名.函数名。
比如 my_moudule.test()。from demo import* 是没有把 demo 导进来。验证识输入 print(m),test(),验证后的结果为 yes,我是 demo 里的 test。
使用 from import* 导入这个模块‘所有’的变量和函数。
本质上是读取模块里 _all_ 属性,看这个属性里定义了哪些变量和函数。如果模块里没有定义 _all_ 才会导入不以_开头的变量和函数。
举例:
_all_=[‘m’.‘test’]
这时填写 print(n) 运行,结果会报错。
如果不写 _all_=[‘m’.‘test’] 就会把
m=‘yes’
n=100
def test():
print(‘我是 demo 模块里的 test 方法’)
def foo():
Print(‘我是 demo 模块里的 foo 方法’)都给导入进来。
也就是说如果写了 _all_=[‘m’.‘test’] 就会限定,但是不写就不会被限定,可以都被导入。注意,如果用 import demo也是可以被使用的。
并不是说不能用,只是 from demo import*的这种形式是不能被用的。
4.区别
(1).使用 from import* 导入这个模块里所有的变量和函数。import my_moudule 导入了模块,导入时需要有模块名点(.)变量名和模块名点(.)函数名。
(2).from demo import* 写法,不再需要写模块名。而 from demo import* 并没有把 demo 导进来。
5.
延伸知识
(1).使用 from 模块名 import* 这种方式无法导入
①.举例,命名为 hello,填写
X=’hello’
Y=1000
以 from hello import* 来导,这时运行的结果为
print(x)
print(y)
总结便是,没有设置 _all_ 会读取以_开始的所有变量的函数
②.举例,测试有下划线时
_age=19
验证 print(_age)是读取不了的
总结便是,以一个下划线开始变量,建议只在本模块里使用,别的模块导不进来。
③.但是,如果坚持想导进来也是可以的,这时可以用 Import hello。验证 Print (hello._age)的结果为 hello,1000,19, 可以看出这种方法也是可以的。
(2).不建议使用以一个下划线开头的模块
如果使用可能会报错
①.举例为 datetime 模块里的_is_leap(year)检测是否为闰年的模块。
使用 from datetime import*
检测 _is_leap(2000 )是会报错的。以一个下划线开始的函数和变量是不能够用 from datetime import* 导入进来的。
②.如果坚持使用,比方使用 import datetime
检测 datetime._is_leap(2000) 也是会报错的。所以,不建议使用,如果强行用,可能会导致崩掉。
(3).强行不让使用的方法:
①.可以在 datetime 里的 is_leap 可以看到
_days_in_montth(year, month):
"year, month -> number of days in that month in that year. assert 1 <= month <= 12, month
if month == 2 and is_leap(year):
return 29
return DAYS_IN_MONTH[month]
运行之后发现 is_leap 内部是经常用的。之后会发现,做了一个操作,此操作为
del (_DAYNAMES,_DAYS_BEFORE_MONTH,_DAYS_IN_MONTH, _DI100Y,_DI4Y,_EPOCH,_MAXORDINAL,_MONTHNAMES,_build_struct_t_check_date_fields,_check_int_field,_check_time_fields_check_tzinfo_arg,_check_tzname,_check_utc_offset,_cm_date_class,_days_before_month,_days_before_year, _day_format_time,_format_offset,is_leap,_isoweek1monday,_ord2ymd,_time,_time_class,_tzinfo_class,_wrap_strft,divide_and_round,_parse_isoformat_date,_parse_isoform_parse_hh_mm_ss_ff)。
其中可以找到加粗的字体,is_leap。这时由于 del,is_leap是不能够使用了。
②.可以填写 del_age,这时可以不被使用
举例为,def bar():
print(‘我是 hello 里的 bar 函数,我只能 hello 文件内部使用’)
这时,检测 print(‘我是 hello 里的 bar 函数,我只能 hello 文件内部使用’)是可以被使用的。
这时如果想删除,就可以填写 del(_age_bar),检测后会发现是崩掉的。