一直对__init__的使用很迷茫,这里系统的学习了解下
1.__init__.py文件-package的标识
python中每个package实际上是一个目录(Directory),程序运行时如何识别它为package呢?
是的,__init__.py第一个作用就是package的标识,倘若没有该文件,则证明该目录不是一个package
python中包和模块的两种导入方式:精确导入和模糊导入
精确导入:
from Pack.pack1 import Pack1Class import Pack.pack1.Pack1Class
模糊导入:
from Pack.pack1 import *
2.定义package中的__all__,控制包的导入行为
而模糊导入中的*中的模块是由__all__来定义的,__init__.py的第二个作用就是定义package中的__all__模块,用于模糊导入
如:
__init__.py 文件
__all__ = ['os', 'sys', 're', 'urllib']
pack1.py文件:
from package1 import *
把注册在__init__.py文件中__all__列表中的模块和包导入到当前文件中来。
可以看到__init__.py可以控制包的导入行为,补充一下:想清楚的理解__init__.py的作用,还需了解import的引用机制:
可以被import语句导入的对象是:
- 模块文件(.py文件)
- 共享库或DLL文件
- 包(包含多个模块)
- 内置模块(使用C编写并已链接到python解释器中)
当导入模块时,解释器按照sys.path列表中的目录顺序来查找导入文件。
3.而def __init__(self) ,def __init__(self,param多参数):
常见的两种类的定义方式:
class Example:
def __init__(self):#两者之间的区别
self.username= None
self.password= None def __init__(self, username, pwd):
self.username= name
self.pwd= pwd
区别很明显,前者在__init__方法中,只有一个self,指的是实例本身;但是后者在方法中,包含username,pwd属性,在定义方法是,就直接给定两个参数
那么他们是如何实例化的呢?
第二种带参数的很明显直接实例化,传入相应参数;
example=Example("haha","")
第一种则需要先实例化,然后针对属性进行赋值
example=Example()
example.username="haha"
example.password=""
思考下:__init__(self)与__init__(self,param多个参数)的区别在哪里呢??
1.__init__(self,param所参数) 定义了这样一种类,他可以是一个空的结构,比如学生的表,当学生还没有进行考试时,他已经有了学生的姓名和成绩,当新的数据来的时候,可以直接添加进来。这个可以很方便的进行
2.__init__(self) 则需要必须传值进来,不允许为空。对已有的数据导入很友好,在语句上减少了很多