Python进阶系列
Python进阶-网络编程-01
Python进阶-网络编程-02
Python进阶-网络编程-03
Python进阶-多任务编程-01
Python进阶-多任务编程-02
Python进阶-多任务编程-03
Python进阶-正则表达式
Python进阶-数据库编程-01
Python进阶-数据库编程-02
Python进阶-数据库编程-03
Python进阶-数据库编程-04
Python进阶-数据拷贝问题
Python进阶-模块导入问题
Python进阶-miniWeb框架
文章目录
15.1. import导入模块路径问题
-
存在的问题:当我们把模块文件放到工程文件夹的外部的文件,发现无法正常引入模块
-
原因:外部的文件夹的路径,没有放到环境变量中去
-
查看环境变量
- 导入
sys
模块 sys.path
查看环境变量 返回值是列表
- 导入
-
把自己写的模块路径添加到环境变量中
#加入环境变量的末位 sys.path.append("自己的路径") #加入到环境变量的开头位置 sys.path.insert(0,"自己的路径")
-
代码实例
import test import sys sys.path.append("D:/Users/Jq/Desktop/test") # module1 模块名 # 查看系统的path 环境变量 # 1)导入模块 # 2)sys.path 可以查看到环境变量的具体位置 print(sys.path) print(test.name)
15.2. import的reload加载问题
-
import 导入模块后,如果模块修改,此时再次import 不起作用,import 自动防止重复包含
-
强制重新一次模块:
reload(函数)
- from imp import reload
- reload(要重新加载的模块)
15.3. from…import的私有化问题
-
私有化:模块中的一些变量不希望被其他模块导入,可以使用私有化解决
-
私有化使用前提:必须使用
"from xxx import *"
-
用法:在模块中,在变量前增加一个下划线
_变量名
-
注意:如果使用其他的方式导入模块,私有化将无效
-
代码实例
from module1 import _age print(_age)
15.4. import和from…import的区别
-
区别:
-
写法:
import 模块名.变量/函数/类
from…import * 变量名/函数/类
-
底层的区别:
import
直接引用了源模块的变量/函数/类from…import *
拷贝源模块的变量/函数/类
-
15.5. 可变参数的拆包问题
-
可变参数
*args
**args
默认会封包过程 -
如果想要这种单数继续传递到下一个函数,传递的时候
func(*args,**kwargs)
-
代码实例
def func01(*args,**kwargs): print("--------func01-------") print(args) print(kwargs) def func02(*args,**kwargs): print(args) print(kwargs) # 调用func01 # func01(args,kwargs) func01(*args,**kwargs) if __name__ == '__main__': func02(10,20,30,40,50,a=10,b=20)
15.6. 单继承中super()
-
super()
使用的时候,self
不用传递 -
super()
调用顺序,按照__mro__
来完成 -
代码实例
class Parent(object): def __init__(self,name): self.name = name print('parent的init结束被调用') class Son(Parent): def __init__(self,name,age): self.age = age super().__init__(name) print('Son1的init结束被调用') class Grandson(Son): def __init__(self,name,age,gender): self.gender = "男" super().__init__(name,age) print('Grandson的init结束被调用') gs = Grandson("grandson",12,'男') print(Grandson.__mro__) print("姓名:",gs.name) print("年龄:",gs.age) print("性别:",gs.gender)
15.7. 多继承和MRO顺序
-
多继承中的super() 执行顺序,严格执行MRO顺序表
-
MRO顺序表:
类名.__mro__
-
注意:
-
当在类中使用
super()
,在mro()
列表中找到当前类的下一个元素,调用该元素的方法 -
多继承,不建议使用
类名
直接调用父类的方法
-
-
代码实例
class Parent(object): def __init__(self,name,*args,**kwargs): self.name = name print('parent的init结束被调用') class Son1(Parent): def __init__(self,name,age,*args,**kwargs): self.age = age super().__init__(name,*args,**kwargs) print('Son1的init结束被调用') class Son2(Parent): def __init__(self,name,gender,*args,**kwargs): self.gender = gender super().__init__(name,*args,**kwargs) print('Son2的init结束被调用') class GrandSon(Son1,Son2): def __init__(self,name,age,gender): super().__init__(name,age,gender) print("GrandSon的init结束被调用") gs = GrandSon('grandson',12,'男') print(GrandSon.mro())
15.8. property基本使用
-
@property
的特点:让我们通过对象.方法名
的方式可以调用方法 -
代码实例
# @proper装饰的方法,只能有一个参数self class Foo(object): def __init__(self,num): self.num = num # 特殊的装饰器 @property def prop(self): return self.num foo = Foo(100) print(foo.prop)
-
代码实例2
class Page(object): def __init__(self,num): self.current_page = num self.page_size = 10 @property def start(self): return (self.current_page - 1) * 10 + 1 @property def end(self): return self.current_page * self.page_size page = Page(2) print(page.start) print(page.end)
15.9. property其他使用方式
-
经典类:@property 一种方式
-
新式类:
-
代码实例
class Goods(object): def __init__(self): self.org_price = 1000 self.discount = 0.7 @property def price(self): return self.org_price * self.discount @price.setter def price(self,val): if val > 0: self.org_price = val @price.deleter def price(self): print("执行了deleter方法") # @property goods = Goods() print(goods.price) # @price.setter goods.price = 500 print(goods.price) # @price.deleter del goods.price
-