Python进阶系列
Python进阶-网络编程-01Python进阶-网络编程-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导入模块路径问题
- 15.2. import的reload加载问题
- 15.3. from…import的私有化问题
- 15.4. import和from…import的区别
- 15.5. 可变参数的拆包问题
- 15.6. 单继承中super()
- 15.7. 多继承和MRO顺序
- 15.8. property基本使用
- 15.9. property其他使用方式
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