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导入模块路径问题

  • 存在的问题:当我们把模块文件放到工程文件夹的外部的文件,发现无法正常引入模块
  • 原因:外部的文件夹的路径,没有放到环境变量中去
  • 查看环境变量
  1. 导入sys模块
  2. 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(函数)
  1. from imp import reload
  2. reload(要重新加载的模块)

15.3. from…import的私有化问题

  • 私有化:模块中的一些变量不希望被其他模块导入,可以使用私有化解决
  • 私有化使用前提:必须使用 "from xxx import *"
  • 用法:在模块中,在变量前增加一个下划线 _变量名
  • 注意:如果使用其他的方式导入模块,私有化将无效
  • 代码实例
from module1 import _age

print(_age)

15.4. import和from…import的区别

  • 区别
  1. 写法
    import 模块名.变量/函数/类from…import * 变量名/函数/类
  2. 底层的区别
    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__
  • 注意:
  1. 当在类中使用super(),在mro()列表中找到当前类的下一个元素,调用该元素的方法
  2. 多继承,不建议使用类名直接调用父类的方法
  • 代码实例
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