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

The*_*ing 2 python

该项目的结构是:

project
- main.py
- session.py
- spider.py

session.py中有一个类:

import requests

class Session:

    def __init__(self):
        self.session = requests.Session()
        print('Session created.')
Run Code Online (Sandbox Code Playgroud)

而spider.py中的另一个类:

from session import Session

class Spider:

    def __init__(self, sess: Session = Session()):
        print('Spider created.')
Run Code Online (Sandbox Code Playgroud)

当我Spider从main.py中的spider.py 导入类时,如下所示:

from spider import Spider

if __name__ == '__main__':

    print('Main function.')
    spider = Spider()
Run Code Online (Sandbox Code Playgroud)

并运行main.py,我得到:

会话已创建.
主功能.
蜘蛛创造了.

这让我很困惑.我认为__init__是初始化实例时使用的初始函数,但在这种情况下,在spider.py中导入时调用__init__函数.我认为它必须与spider.py 中函数的默认值相关,但为什么呢?SessionSession__init__

kal*_*ann 10

参数的默认值仅在python中计算一次.这是记录在这里,并在这里按规定JETM.

因此,Session当您spider作为sessspiders __init__方法的参数的默认值导入时,会创建一个isntance .

如果您不希望这样的行为,您可以使用None默认值并Sesssion__init__方法内创建实例,如果没有提供其他值,如MatsLindhFHTMitchel所指出的那样:

...
def __init__(self, sess: Session = None):
    if sess is None:
        sess = Session()
    print('Spider created.')
Run Code Online (Sandbox Code Playgroud)

  • @MatsLindh甚至更好:`如果sess是None:sess = Session()` (3认同)
  • ..解决方法是设置`sess = None`,然后在该类'__init__`中设置`if not sess:sess = Session()`. (2认同)