热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么从另一个文件导入类会调用__init__函数?》经验,为你挑选了1个好方法。

该项目的结构是:

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 中函数的默认值相关,但为什么呢?SessionSession__init__



1> kalehmann..:

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

因此,Session当您spider作为sessspiders __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()`.
推荐阅读
author-avatar
zeng-abee
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有