为什么从另一个文件导入类会调用__init__函数?

时间:2018-10-10 11:17:22

标签: python

项目的结构为:

项目
-main.py
-session.py
-spider.py

session.py中有一个类:

import requests

class Session:

    def __init__(self):
        self.session = requests.Session()
        print('Session created.')

spider.py中的另一个类:

from session import Session

class Spider:

    def __init__(self, sess: Session = Session()):
        print('Spider created.')

当我像这样从main.py中的spider.py导入类Spider时:

from spider import Spider

if __name__ == '__main__':

    print('Main function.')
    spider = Spider()

运行main.py,我得到:

  

会话已创建。
  主要功能。
  创建蜘蛛。

这让我感到困惑。我认为__init__是初始化实例时使用的初始函数,但是在这种情况下,当__init__导入spider.py中时,将调用Session的{​​{1}}函数。我认为它必须与spider.py中Session函数的默认值有关,但是为什么呢?

1 个答案:

答案 0 :(得分:10)

参数的默认值在python中仅评估一次。这是documented here,也是here所说的JETM

因此,当您导入Session作为蜘蛛spider方法的sess参数的默认值时,会创建__init__的空白。

如果您不希望出现这种情况,可以使用None作为默认值,如果{所指出的未提供其他值,则可以在Sesssion方法内创建__init__实例{3}}和MatsLindh像这样:

...
def __init__(self, sess: Session = None):
    if sess is None:
        sess = Session()
    print('Spider created.')