python中main方法的用法_python __main__和__init__正确用法

因为我对python很新,所以语言的这个特殊方面对我来说仍然是不透明的.

因此,假设我的项目包含许多包含代码的文件和两个“服务”文件:__ init__.py和__main__.py

在__init__.py中只有:

if __name__ == "__main__":

import package.__main__

__main__.main()

在__main__.py中如下:

import package # ok

import package2 # ok

def main():

package.myfunc1() # can't find reference to myfunc1

package2.myfunc2() # can't find reference to myfunc2

所以我的问题是:为什么两个包都可见而内部函数不是?我已经阅读了谷歌的一些源代码,但仍无法发现它与我的代码之间的区别.我正在使用Python 3.5.1

我假设,__ init__中的代码将启动__main__,而__ main__将启动我的其余功能.

UPD

好吧,如果我把某人与我的代码混淆了,我很抱歉.

支持__init__.py的想法是该文件是在第一个包添加时由IDE创建的,因此我决定在第一个github条目中找到code(我的错,我可以通过复制粘贴重新使用它) ).

严格来说,我只需要python构造,相当于这个C代码:

header.h

void func1(){...} //in code1.c

void func2(){...} //in code2.c

#include "header.h"

int main() //in main.c

{

func1();

func2();

return 0;

}

以下代码

import package

import package2

if __name__ == "__main__":

package.myfunc1()

package2.myfunc2()

与上述问题完全相同,因此问题不在__init__.py中

解决方法:

我做了:

foo/

__init__.py

__main__.py

这2个文件是:

import __main__

print('in init')

print('init name',__name__)

print('main name',__name__)

print('in main')

if __name__=='__main__':

print('in main main block')

如果我直接运行__main__:

1538:~/mypy$python foo/__main__.py

('main name', '__main__')

in main

in main main block

如果我调用目录,它也会做同样的事情.它不会导入__init__.py.

1541:~/mypy$python foo

('main name', '__main__')

in main

in main main block

但是从shell中,它会加载两个文件

1542:~/mypy$python

....

>>> import foo

('main name', 'foo.__main__')

in main

in init

('init name', 'foo')

但是它不使用__main__的if __name__块 – 名称不对,它现在是foo .__ main__.

相关文档

Execute the Python code contained in script, which must be a filesystem path (absolute or relative) referring to either a Python file, a directory containing a __main__.py file, or a zipfile containing a __main__.py file.

This module represents the (otherwise anonymous) scope in which the interpreter’s main program executes — commands read either from standard input, from a script file, or from an interactive prompt. It is this environment in which the idiomatic “conditional script” stanza causes a script to run:

我用__init__.py创建了另一个目录但没有main:

1558:~/mypy$python foo1

/usr/bin/python: can't find '__main__' module in 'foo1'

1558:~/mypy$python

...

>>> import foo1

('in init', 'foo1')

>>>

导入工作,但我无法运行该目录.

标签:python,main,initialization

来源: https://codeday.me/bug/20190608/1201490.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python,有三个特殊方法被称为魔术方法:__new__、__init__和__call__。__new__方法用于创建一个类的实例,它在__init__方法之前被调用。__init__方法通常用于初始化一个类的实例,它在对象创建后立即调用。__call__方法使一个对象可被调用,就像调用一个函数一样。下面是一个示例代码来说明这三个方法的使用: ```python class MyClass(object): def __new__(cls, *args, **kwargs): instance = super().__new__(cls) # 在这里可以对实例进行一些初始化操作 return instance def __init__(self, *args, **kwargs): # 在这里进行实例的初始化操作 pass def __call__(self, *args, **kwargs): # 在这里定义对象被调用时的行为 pass if __name__ == '__main__': my_obj = MyClass() my_obj() # 调用对象 ``` 在上面的代码,__new__方法用于创建一个类的实例,并返回该实例。__init__方法用于初始化实例的属性。__call__方法定义了当对象被调用时的行为。这些特殊方法可以根据需要进行重写,以实现自定义的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Python的__new__、__init__、__call__三个特殊方法](https://blog.csdn.net/jiangjiang_jian/article/details/80024100)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [详解Python的__new__、__init__、__call__三个特殊方法](https://blog.csdn.net/qq_15821487/article/details/119737869)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值