python 共享全局变量

0X01 场景

最近几次遇到下面场景:
函数调用关系   A->B->C->D->E->F->G
G处需要一个X数据,但这个X数据只有A处出现过,中间过程由于某种原因难以修改  (比如 中间某一阶段程序外其他人员写的几百个插件,在模板设立之初就没有考虑传递该数据,改模板意味着要改几百个插件)

0X02 将数据传入类本身里

这里并不是指类的实例,而是在A截断就将数据传入G调用的类里。
每个类相当于一个模板,在进程开启的时候,只存一份在内存中。
将数据直接怼到类里作为一个属性,就可以实现在A处跳着直接传数据给G。

0X03 更简单通用的方法

0X02中使用的类其实是使用了其可变对象存的是指针的特点。
如此可以另起一个文件,用于存储一个可变对象,可以是:
队列
字典

类对象

之后在文件A处引用并改动 (传入数据),在G处引用拿出数据就好了。

0X04 实例

__init__.py
my_class.py
my_test_1.py
my_test_2.py
# my_class.py
MyConf = "NULL"
MyAAA = []


class MyCl:
    my_param = ""

    def __init__(self):
        pass

# my_test_1.py
""" 如果在程序开头设置一个类的变量,在其他地方能调用么 """
from sqlmap_qps_test.my_test_2 import func_two
from sqlmap_qps_test.my_class import MyCl, MyAAA
from sqlmap_qps_test.my_class import MyConf
import sqlmap_qps_test

MyCl.my_param = "1"
MyCl()
sqlmap_qps_test.MyConf = "2"
MyAAA.append("3")
func_two()

# my_test_2.py
def func_two():
    from sqlmap_qps_test.my_class import MyCl
    mm = MyCl()
    print(mm.my_param)
    from sqlmap_qps_test.my_class import MyConf
    print(MyConf)
    import sqlmap_qps_test
    print(sqlmap_qps_test.MyConf)
    from sqlmap_qps_test.my_class import MyAAA
    print(MyAAA)

运行my_test_1.py结果

1
NULL
2
['3']

第一行 mm.my_param  为 1,被修改
在test_1中,1被传入作为类的属性,所以在test_2中,属性调用拿到这个1

第二行 MyConf 为NULL,无改动
在test_1中,修改了 sqlmap_qps_test这个文件(指针存在)里的MyConf;在test_2中,引入了MyConf,直接传入一个字符串,另外一个地址,而不是sqlmap_qps_test文件指向的属性。
所以之间修改互不影响

第三行 sqlmap_qps_test.MyConf.MyConf,被修改
在test_1中,修改了 sqlmap_qps_test这个文件(指针存在)里的MyConf;test_2调用拿到了文件地址指向的MyConf

第四行 队列 MyAAA ,被修改
在test_1中,修改了队列实例;在test_2中,拿到了队列实例的地址,也拿到了修改后的内容

posted @ 2020-06-09 15:25  huim  阅读(978)  评论(0编辑  收藏  举报