Python进阶-模块导入问题

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

  • 存在的问题:当我们把模块文件放到工程文件夹的外部的文件,发现无法正常引入模块

  • 原因:外部的文件夹的路径,没有放到环境变量中去

  • 查看环境变量

    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
      
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值