import导入模块路径问题
存在的问题:当我们把模块文件放到工程文件夹的外部的文件,发现无法正常引入模块
原因:外部的文件夹的路径,没有放到环境变量中。
查看环境变量
- 1.导入
sys
模块 - 2.
sys.path
查看环境变量返回值是列表
- 1.导入
把自己写的模块的路径加入到环境变量中
|
|
|
|
import导入模块
import
会防止重复导入- 在同一个程序中多次
import
同一个模块,只会执行一次
- 在同一个程序中多次
- 重新导入模块
为什么需要重新导入模块?
模块被导入后,import module不能重新导入模块,重新导入需用reload重新加载模块代码创建模块对象
准备一个模块 reload_test 并定义一个函数 test 代码如下:
|
|
|
|
from XX import XX
的私有化问题
|
|
|
|
import 和from..…import的区别
- import XXX
- 此种方式是直接引用
- from XXX import xxx
- 此种方式是把XXX的内容复制一份到程序中,若修改不应用到原来的模块
可变参数的拆包
|
|
新式类的属性和一些概念
|
|
类属性的增加和修改
|
|
单继承的super
super()
使用的时候,传递参数的时候,self
不用传递super()
调用顺序,按照__mro__
顺序来完成Grandson.mro
是一个元组当在类中使用super
在__mro__
列表中找到当前类的下一个元素,调用该元素的方法。
|
|
多继承和MRO顺序
|
|
使用super()
调用父类
MRO顺序
通过上述代码,我们发现由于多继承情况,parent类被的属性被构造了两次,如果在更加复杂的结构下可能更加严重。为了解决这个问题,Python官方采用了一个算法将复杂结构上所有的类全部都映射到一个线性顺序上,而搜索的顺序就是所谓的「方法解析顺序」(Method Resolution Order,或MRO),根据这个顺序就能够保证所有的类都会被构造一次。
MRO查看
类名.mro()
类名.__mro__
|
|
注意
当在类中使用super()在 mro列表中找到当前类的下一个元素,调用该元素的方法
多继承中,不建议使用类名直接调用父类的方法
类的@classmethod
、@staticmethod
装饰方法
@classmethod
用来修饰方法。使用在实例化前与类进行交互,但不和其实例进行交互的函数方法上。@staticmethod
用来修饰类的静态方法。使用在有些与类相关函数,但不使用该类或该类的实例。如更改环境变量、修改其他类的属性等。
两者最明显的区别,classmethod
必须使用类的对象作为第一个参数,而staticmethod
则可以不传递任何参数
1、@classmethod
类方法
类方法,我们不用通过实例化类就能访问的方法。而且@classmethod 装饰的方法不能使用实例属性,只能是类属性。它主要使用在和类进行交互,但不和其实例进行交互的函数方法上。
下面,我们要写一个只在类中运行而不在实例中运行的方法。
简单示例,读取私有化类属性数据,如下:
|
|
Circle
类下的pi()
方法被@classmethod
装饰后,我们能通过Circle.pi()
直接运行方法,不用实例化类。
示例:重构构造__init__()
方法应用, 格式化创建时间实例
|
|
from_string 返回的是Date类的实例,所以我们可以通过from_string 实例化类。 注意:
from_string(cls, date_as_string)
中cls
表示的是类,它和self
类实例有一定的差别。类方法中都是使用cls
,实例方法中使用self
。
2、@staticmethod
静态方法
@staticmethod
和@classmethod
非常的相似,但是@staticmethod
不强制要求传递参数(它做的事与类方法或实例方法一样)。@staticmethod
使用在有些和类相关函数,但不使用该类或者该类的实例。如更改环境变量、修改其他类的属性等。
一句话@staticmethod
修饰的方法是放在类外的函数,我们为了方便将他移动到了类里面,它对类的运行无影响。
示例:
|
|
is_date_valid(date_as_string)
只有一个参数,它的运行不会影响类的属性,
注意:
@staticmethod
修饰方法is_date_valid(date_as_string)
中无实例化参数self
或者cls
;而@classmethod
修饰的方法中有from_string(cls, date_as_string)
类参数cls
。
@property装饰方法
定义时,在实例方法的基础上添加@property 装饰器;
- 并且仅有一个self参数
调用时,无需括号
方法:
foo_obj.func()
property属性:foo_obj.prop
|
|
property的其它功能
|
|
property的另一种使用方法
|
|
- property(第一个参数,第二个参数,第三个参数,第四个参数)
- 第一个参数,当我们foo.BAR自动调用第一个参数的方法
- 第二个参教,当我们foo.BAR=100,自动调用第二个参数的方法
- 第三个参数,当我们del foo.BAR,自动调用第三个参数的方法
- 第四个参数,当我们Foo.BAR.doc,自动获取第四个参数的内容
property实现延迟计算
|
|
类的魔法属性和方法
魔术属性
__doc__
描述类的信息和类方法的信息- 获取类名
类名.__doc__
- 获取对象
对象.方法名.__doc__
- 获取类名
__model__
获取所属的模块(对象名.__module__
)直接运行该文件 获取main
__class__
获取对象所属的类对象名.__class__
__dict__
获取对象或类的信息- 通过
__dict__
获取对象信息,对象.__dict__
返回字典 - 通过
__dict__
获取类信息类名.__dict__
返回值是一个字典
- 通过
魔术方法
__init__
初始化方法类名()
自动调用__del__
删除对象的时候, 会调用__del__方法
__call__()
使用对象名()
会调用该方法__str__()
打印对象的会调用print(obj)
__str__
方法一定要return
,而且必须return
字符串内容- 用字典的书写格式操作对象的方法
__getitem__
对象[‘XX’]__setitem__
对象[‘XX’] = xx__delitem__
del 对象[‘xx’]
|
|