python中__init__.py与def __init__(self)的使用

时间:2023-02-24 13:54:14

一直对__init__的使用很迷茫,这里系统的学习了解下

python中__init__.py与def __init__(self)的使用

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) 则需要必须传值进来,不允许为空。对已有的数据导入很友好,在语句上减少了很多