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