加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

类属性的值不同,具体取决于它们的访问位置(Python 3)

发布时间:2020-12-20 11:58:18 所属栏目:Python 来源:网络整理
导读:它似乎取决于它们的访问位置,类属性没有相同的值.我不明白为什么会这样,任何理解这个或解决它的帮助都会受到欢迎. 请考虑以下.py文件: foo.py: from bar import *class Foo: someAttribute = None @classmethod def update(cls,value): cls.someAttribute
它似乎取决于它们的访问位置,类属性没有相同的值.我不明白为什么会这样,任何理解这个或解决它的帮助都会受到欢迎.

请考虑以下.py文件:

foo.py:

from bar import *


class Foo:
    someAttribute = None

    @classmethod
    def update(cls,value):
        cls.someAttribute = value


def main():
    Foo.update("some value")
    print(Foo.someAttribute)
    bar = Bar()
    bar.showStuff()


if __name__ == '__main__':
    main()

和bar.py:

from foo import *


class Bar:

    def showStuff(self):
        print(Foo.someAttribute)

人们会期望并打算输出对于两个打印指令都是“某种值”.但我的输出如下:

$python foo.py
some value
None

解决方法

你在内存中有两个foo模块的副本.一个叫做__main__,另一个叫做foo.这是因为您将foo作为脚本运行,然后将其存储为__main__模块.

所以当你运行python foo.py时会发生以下情况:

> sys.modules [‘__ main__’]用于保存脚本命名空间.
>从吧导入*运行

>创建sys.modules [‘bar’]以保存条形模块命名空间.
>从foo import *运行

> sys.modules [‘foo’]用于保存foo模块命名空间.
>从bar import *运行,找到sys.modules [‘bar’]对象.
>空的sys.modules [‘bar’]模块中不存在任何名称,不会导入任何内容
> Foo类和main函数被添加到foo模块中.
>跳过if __name__ ==’__ main__’,这是foo模块.

>将名称Foo和main添加到条形命名空间
> Bar类添加到bar命名空间

>将名称Foo,main和Bar添加到__main__命名空间
>新对象Foo和main在__main__命名空间中创建.
>执行if __name__ ==’__ main__’块并调用main().

从bar中的__main__导入,或使用第三个python文件作为主脚本.

请注意,如果您使用__main__ import *,则确实存在循环导入问题.这是因为from __main__ import *不会包含from foo import *行运行时尚未执行的任何内容,请参阅上面的细分.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读