项目的结构为:
项目
-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
函数的默认值有关,但是为什么呢?
答案 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.')