鱼C论坛

 找回密码
 立即注册
查看: 820|回复: 11

[已解决]python 051中动动手的第0题

[复制链接]
发表于 2018-12-21 12:01:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. # a.py
  2. import b

  3. def x():
  4.     print('x')

  5. b.y()

  6. # b.py
  7. import a

  8. def y():
  9.     print('y')

  10. a.x()

  11. 执行 b.py 引发下边异常:
  12. >>>
  13. Traceback (most recent call last):
  14.   File "/Users/FishC/Desktop/b.py", line 1, in <module>
  15.     import a
  16.   File "/Users/FishC/Desktop/a.py", line 1, in <module>
  17.     import b
  18.   File "/Users/FishC/Desktop/b.py", line 6, in <module>
  19.     a.x()
  20. AttributeError: 'module' object has no attribute 'x'
复制代码


这是出错的代码, 整体的流程我明白了, 执行b.py  会import  a然后找到a文件,第一行是import b  再回到b文件,接下来定义 y函数, 再执行a.x(),因为在引入的过程中a文件只运行到import B,还没有生成x()函数, 所以报错

  1. # a.py
  2. import b

  3. def x():
  4.     print('x')

  5. if __name__ == "__main__":
  6.     b.y()

  7. # b.py
  8. import a

  9. def y():
  10.     print('y')

  11. if __name__ == "__main__":
  12.     a.x()
复制代码


然后接下来是答案, 加上了 __name__ =="__main__"后就可以执行了 ,我没有看懂,   我的理解是前面的流程还是一样的,还是从b文件中开始运行, 此时b文件的name应该就是main,所以执行到 if__name__=="__main__"的时候应该是True吧,  然后接着执行a.x(), 但是x()的函数在a中还是没有生成,还是应该报错才对.这是我错误的理解.

求教真正的流程应该怎么走 感谢!
最佳答案
2018-12-22 11:28:04
蛋疼的烤鸭 发表于 2018-12-21 22:04
感谢您的回复,这个我是知道的, 我是不太理解 比如说我要从b.py文件开始执行,那么x.a()将会被执行,而x.b() ...

你需要了解一下模块和程序的问题。
你在a.py导入的b.py是程序,而没有成功导入到b.py里面的y函数。  
你谷歌一下:
  1. python if __name__ == "__main__":
复制代码

理解一下作用。
__name__是什么
__main__是什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-12-21 17:12:37 | 显示全部楼层
__name__ =="__main__"

加上就告诉代码,我才是主的。也可防止重复加载;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-21 17:48:33 | 显示全部楼层
ba21 发表于 2018-12-21 17:12
__name__ =="__main__"

加上就告诉代码,我才是主的。也可防止重复加载;

您好,感谢您的回复. 我想知道加上这局代码以后程序是如何跑的, 能麻烦您解释一下吗,感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-21 17:54:15 | 显示全部楼层
蛋疼的烤鸭 发表于 2018-12-21 17:48
您好,感谢您的回复. 我想知道加上这局代码以后程序是如何跑的, 能麻烦您解释一下吗,感谢

还是一样的跑啊。就是忽略重复加载
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-21 18:20:50 | 显示全部楼层
本帖最后由 gps_davids 于 2018-12-21 18:22 编辑
ba21 发表于 2018-12-21 17:54
还是一样的跑啊。就是忽略重复加载


这个我也不是很懂,是不是说的是有了“__name__ =="__main__"”后,只有在b.py作为主程序的时候才执行a.x(),而在被a调用的时候就不执行了?

但是这样也有夜歌问题呀,当在执行a的时候,同样有import b被执行了呀,这样不是一样会出问题?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-21 21:02:59 | 显示全部楼层
ba21 发表于 2018-12-21 17:54
还是一样的跑啊。就是忽略重复加载

我知道会忽略重复加载...  不过重复加载不是和__name__ =="__main__"没关系吗,  我就是想知道流程是怎么个过程,还是没想通
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-21 21:33:49 | 显示全部楼层
  1.     # 当.py文件运行时,在if __name__ == "__main__":下的的代码将会运行
  2.     # 当该文件被当成模块运行时,if __name__ == "__main__":下的代码不会被运行
  3. if __name__ == "__main__":
  4.     main()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-21 22:04:07 | 显示全部楼层

感谢您的回复,这个我是知道的, 我是不太理解 比如说我要从b.py文件开始执行,那么x.a()将会被执行,而x.b()将不会被执行, 那么在执行x.a()的时候 a()函数不是还没有被定义吗,  为什么不会报错呢.  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-22 11:28:04 | 显示全部楼层    本楼为最佳答案   
蛋疼的烤鸭 发表于 2018-12-21 22:04
感谢您的回复,这个我是知道的, 我是不太理解 比如说我要从b.py文件开始执行,那么x.a()将会被执行,而x.b() ...

你需要了解一下模块和程序的问题。
你在a.py导入的b.py是程序,而没有成功导入到b.py里面的y函数。  
你谷歌一下:
  1. python if __name__ == "__main__":
复制代码

理解一下作用。
__name__是什么
__main__是什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-22 11:31:54 | 显示全部楼层
本帖最后由 heidern0612 于 2018-12-22 11:52 编辑
蛋疼的烤鸭 发表于 2018-12-21 22:04
感谢您的回复,这个我是知道的, 我是不太理解 比如说我要从b.py文件开始执行,那么x.a()将会被执行,而x.b() ...


先看a.py文件
  1. # a.py

  2. import b

  3. def x():
  4.     print('x')
  5.    
  6. if __name__=="__main__":
  7.    
  8.     b.y()
复制代码



看来你对__name__=="__main__"有误解。


当文件作为主文件运行的时候,__name__对应的值就是缺省值__main__,当文件被调用或者导入的时候,当前文件显示的是模块名,而不是__main__。

以上判定的是当前的文件名,而不是当前代码里的函数。


假如你叫小明,你作为你自己(__main__),你从来不喊自己的名字。但是对别人来说(import),你就是小明(文件名)。


a.py是主文件,满足if条件,所以if下的文件会被执行,执行的b.y()打印结果。

b.py同理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-22 11:39:00 | 显示全部楼层
本帖最后由 heidern0612 于 2018-12-22 11:51 编辑
蛋疼的烤鸭 发表于 2018-12-21 22:04
感谢您的回复,这个我是知道的, 我是不太理解 比如说我要从b.py文件开始执行,那么x.a()将会被执行,而x.b() ...


如果你还不明白为什么重复,我给你举个简单的例子

  1. # a.py

  2. pintree ="我是一只松树"

  3. def christmastree():
  4.     print("===圣诞节来临===")
  5.     print("我装饰上了彩带")
  6.     print("===圣诞节结束了===")
  7.     print("我还是一颗松树")


  8. christmastree()


  9. #b,py

  10. import a

  11. print(a.pintree)
复制代码



以上我b文件只是简单的引用了下a里的pintree,b里面测试程序输出的主函数我不想运行,但结果却和b主程序一样。

但如果a里加上if语句就完全不一样了,也没重复调用了。

ps:我还没学到老师讲的课程,不知道老师讲的什么样,但是我这个我可以说算是理解比较简单的了。


  1. # a.py

  2. pintree ="我是一只松树"

  3. def christmastree():
  4.     print("===圣诞节来临===")
  5.     print("我装饰上了彩带")
  6.     print("===圣诞节结束了===")
  7.     print("我还是一颗松树")

  8. if __name__=="__main__":
  9.     christmastree()


  10. #b,py

  11. import a

  12. print(a.pintree)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-22 13:58:35 | 显示全部楼层
wongyusing 发表于 2018-12-22 11:28
你需要了解一下模块和程序的问题。
你在a.py导入的b.py是程序,而没有成功导入到b.py里面的y函数。  
你 ...

感谢你,我明白了  其实我的问题不是name main的问题,是忘了回溯的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-17 13:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表