作者:zeng-abee | 来源:互联网 | 2022-12-02 16:27
该项目的结构是:
project
- 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.')
当我Spider
从main.py中的spider.py 导入类时,如下所示:
from spider import Spider
if __name__ == '__main__':
print('Main function.')
spider = Spider()
并运行main.py,我得到:
会话已创建.
主功能.
蜘蛛创造了.
这让我很困惑.我认为__init__
是初始化实例时使用的初始函数,但在这种情况下,在spider.py中导入时调用__init__
函数.我认为它必须与spider.py 中函数的默认值相关,但为什么呢?Session
Session
__init__
1> kalehmann..:
参数的默认值仅在python中计算一次.这是记录在这里,并在这里按规定JETM.
因此,Session
当您spider
作为sess
spiders __init__
方法的参数的默认值导入时,会创建一个isntance .
如果您不希望这样的行为,您可以使用None
默认值并Sesssion
在__init__
方法内创建实例,如果没有提供其他值,如MatsLindh和FHTMitchel所指出的那样:
...
def __init__(self, sess: Session = None):
if sess is None:
sess = Session()
print('Spider created.')
@MatsLindh甚至更好:`如果sess是None:sess = Session()`
..解决方法是设置`sess = None`,然后在该类'__init__`中设置`if not sess:sess = Session()`.