
1 ballshapesdsd 2018 年 3 月 17 日 aaaa 不是计算好的随机值么,怎么会变化,你不要骗我 |
2 jingniao 2018 年 3 月 17 日 via iPad python 导入规则,导入的时候会运行这个文件,所以,运行时,随机数被确认 然后模块级别的变量是单例的,所以其他地方用这变量都是一致 |
4 Zzzzzzzzz 2018 年 3 月 17 日 启动文件里定义一个继承 types.ModuleType 的 class, 里面用 property 封装一个类函数, 灌进 sys.modules 里 不过这种黑魔法还是少用, 定义一个函数挺好的 |
5 Zzzzzzzzz 2018 年 3 月 17 日 In [1]: import sys, types, random In [2]: class DummyModule(types.ModuleType): value = property(lambda _: random.randint(1, 10000)) In [3]: sys.modules['dummy_module'] = DummyModule('dummy_module') In [4]: import dummy_module In [5]: dummy_module.value Out[5]: 8462 In [6]: dummy_module.value Out[6]: 4497 In [7]: dummy_module.value Out[7]: 876 In [8]: dummy_module.value Out[8]: 7946 大致就是这样, 不过真这么玩儿, 出点问题排查起来很麻烦的 |
6 pkookp8 2018 年 3 月 17 日 via Android reload 和 exec,了解一下? |
7 polythene 2018 年 3 月 17 日 楼上各位大佬的黑魔法尽量不要用,还是封装成函数,每次调用的时候产生一个随机数比较正常 |
8 jakeyfly OP 大佬们的元类 我看了就头疼 上回写个代理池 我参考别人一个 就是元类写的 我直接改成类方法的 太可怕了 那个要是出错了 根本想不到是那里的问题 |
9 ipwx 2018 年 3 月 17 日 你为啥要让这个 module level 的值变化?用个函数不好吗? hack 的方法总是有的,但是这违背了 python 程序的一般形式,是不好的。 另外原则上你只有 from A import aaaa 才会让 aaaa 的变更无法作用于 B。事实上 import A,然后用 A.aaaa 的话,你总是可以重新设置 A.aaaa = random.randint(),并且影响到 B 的。 |
10 ipwx 2018 年 3 月 17 日 比如你在 A.py 里面: __aaaa = [None] def reset_aaaa(): __aaaa[0] = random.randint() def get_aaaa(): return __aaaa[0] reset_aaaa() 这样不是就很好嘛? |
11 wd 2018 年 3 月 17 日 via iPhone 没看懂。你是不是需要一个实例变量? |
12 littlewey 2018 年 3 月 17 日 via iPhone 去定义一个 class 使用时候实例化它比较自然吧。 包里的东西只 import 时候执行一次。 |